在父解析完成之前运行子路由上的 CanActivate 守卫 [英] CanActivate guards on child routes run before parent Resolve finish

查看:22
本文介绍了在父解析完成之前运行子路由上的 CanActivate 守卫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在导航到儿童路线之前解析数据,因为我必须在儿童保护中使用该数据.问题是父解析器,在子保护被触发后解析数据.解析器需要很长时间来解析数据

I'm trying to resolve data before navigating to children routes as i have to use that data in children guard. The issue is parent resolver, resolves data after the child guard is fired. Resolver takes long time to resolve data

// app.module.ts
const appRoutes: Routes = [
  { path: 'login', component: LoginComponent },
  {
    path: '',
    component: SiteLayoutComponent,
    children: [
      { path: '', redirectTo: 'warehouse', pathMatch: 'full' },
      {
        path: 'warehouse',
        loadChildren: './warehouse/warehouse.module#WarehouseModule'
        // loadChildren: () => WarehouseModule
      }
    ],
    canActivate: [AuthGuard],
    resolve: {
      Site: SiteResolver // should be resolved before the guard is invoked.
    }
  },
  { path: '**', component: PageNotFoundComponent }
];

// warehouse.module.ts
const appRoutes: Routes = [

    { path: '', redirectTo: 'cash', pathMatch: 'full' },
    { path: 'cash', component: CashComponent, canActivate: [RouteGuard] // should be invoked after the parent resolver resloves th data }

];

这里,父解析器,即 SiteResolver,在调用子保护器,即 RouteGuard 之后解析.我想要的是 SiteResolver 首先解析数据,然后 RouteGuard 应该触发,我该如何实现?

Here, the parent resolver i.e. SiteResolver resolves after the child guard i.e. RouteGuard is invoked. What i want is SiteResolver to resolve data first and then RouteGuard should fire, how can i achieve that ?

推荐答案

我不确定这是否是正确的方法.但是在经历了很多角度问题之后,我找到了一个解决方法.

I am not sure if this is the correct method. But after going through a lot of angular issues , i found a workaround.

代替 resolve ,使用 canActivate 获取数据并将数据存储在服务中.下面是相同的代码片段

Instead of resolve , use canActivate to fetch data and store the data in the service. Below is the code snippet for the same

@Injectable()
export class FetchUserData implements CanActivate {
  constructor(
    private userService: UserService,
    private httpClient: HttpClient
  ) {}
  public modalRef: BsModalRef;
  canActivate() {
    return this.httpClient
      .get("some/api/route")
      .map(e => {
        if (e) {
          this.userService.setUserDetails(e);
          return true;
        }
        return true;
      })
      .catch(() => {
        return Observable.of(false);
      });
  }
}

它对我很有效.刷新子路由没有问题.

It worked for me well. You will have no problem in refreshing the child route.

这篇关于在父解析完成之前运行子路由上的 CanActivate 守卫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆