CanLoad guard 是否可以在 Electron 应用程序中使用?

Is CanLoad guard usable within Electron application?

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

routes.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.logdebugger 试过)。当我将其更改为 canActive 并在 'parent' 路由文件中执行时,它也不会触发。它唯一一次触发是当我将它更改为 canActive 并将其移动到 'child' 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 是否可能一次加载所有内容,因此无法调用此守卫?

您可以将获取路由定义为模块中的子项,并添加 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',
};

查看此答案: