0

我有来自 BE 的权限 DTO,它决定了用户可以访问的应用程序部分。使用 NgRx 选择器我想在 CanLoad 守卫中使用它,但我无法让它工作。

路线.ts

{
  path: 'acquisition',
  canLoad: [AcquisitionGuard],
  loadChildren: () => import('./acquisition/acquisition.module').then(m => m.AcquisitionModule),
  pathMatch: 'full',
},

守卫:

canLoad(route: Route, segments: UrlSegment[]): Observable<boolean> | Promise<boolean> | boolean {
  console.log('canLoad guard'); //never fires
  return this.store.select(fromPermission.canAcess);
}

出于某种原因,这个守卫永远不会触发(尝试使用console.logand debugger)。当我将其更改为canActive并在“父”路由文件中执行时,它也不会触发。它触发的唯一时间是我将其更改为canActive并将其移动到“子”routes.file

获取.routes.ts

{
  path: 'acquisition',
  canActive: [AcquisitionGuard], //This is the only time I'll get some response from the guard
  component: AcquisitionComponent,
  children: [...],
},

编辑: 看起来这是由这样一个事实引起的,一旦模块被加载,'CanLoad' 守卫就不会再次被触发。是否有可能 Electron 一次加载所有内容,因此无法调用该守卫?

4

1 回答 1

1

您可以将获取路由定义为模块中的子模块,并添加canActivateChild将处理此模块所有路由的保护。

// acquisition.module.ts

const acquisitionRoutes: Routes = [
    {
        path: '',
        canActivate: [AuthGuard],
        canActivateChild: [AuthGuard],
        children: [
           ...
        ]
    },
];

// app.routing.ts
 {
     path: 'acquisition',
     loadChildren: () => import('./acquisition/acquisition.module').then(m => m.AcquisitionModule),
     pathMatch: 'full',
};

看看这个答案:Lazy load module with Router Guard with dynamic routes in Angular4

于 2020-10-20T07:58:11.287 回答