Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度5:条件模块延迟加载_Angular_Angular Cli - Fatal编程技术网

Angular 角度5:条件模块延迟加载

Angular 角度5:条件模块延迟加载,angular,angular-cli,Angular,Angular Cli,我在尝试根据用户配置文件延迟加载模块时遇到问题, 我定义了三个默认路径(每个路由都有空路径),每个用户都可以访问特定的模块, 我正在使用一个守护程序来确定当前用户配置文件(实际上我正在手动切换,通过设置const canGo=true来设置默认加载的模块) 预期的行为是,实际路由配置应该根据配置文件激活适当的路由,但事实并非如此 export const routes: Routes = [ { path: '', loadChildren: 'app/user/user.m

我在尝试根据用户配置文件延迟加载模块时遇到问题, 我定义了三个默认路径(每个路由都有空路径),每个用户都可以访问特定的模块, 我正在使用一个守护程序来确定当前用户配置文件(实际上我正在手动切换,通过设置const canGo=true来设置默认加载的模块)

预期的行为是,实际路由配置应该根据配置文件激活适当的路由,但事实并非如此

export const routes: Routes = [
  {
    path: '',
    loadChildren: 'app/user/user.module#UserModule',
    canActivate: [
      CanActivateUserModuleGuard
    ],
  },
  {
    path: '',
    loadChildren: 'app/admin/admin.module#AdminModule',
    canActivate: [
      CanActivateAdminModuleGuard
    ]
  },
  {
    path: '',
    loadChildren: 'app/moderator/moderator.module#ModeratorModule',
    canActivate: [
      CanActivateModeratorModuleGuard
    ]
  },
  {
    path: '404',
    component: NotFoundComponent
  }
];
注意: 如果感兴趣,请在网上发布


实现此要求的最佳方法是什么?

路由器只会在其匹配的第一条路由上尝试防护。由于这一限制,您必须尝试两种选择之一

第一个是实现一个定制,它将有效地完成您的防护工作,然后只在您想要加载的模块上匹配它。如果您需要使用其他服务,这可能会很困难,因为
UrlMatcher
只是一个函数,因此您不会得到任何DI

第二个选项是具有路径
'
的通用路由,该路径上有另一个执行其他三个防护动作的防护装置,然后路由到适当的模块。这听起来有点像黑客,但是,在ToH教程中建议这样做

警卫
导出类CanActivateModuleGuard实现CanActivate{
构造函数(专用路由器:路由器、,
私有userGuard:CanActivateUserModuleGuard,
私有adminGuard:CanActivateAdminModuleGuard,
私有modGuard:CanActivateModeratorModuleGuard){}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值{
让canGo=[{
卫兵:这个。管理员卫兵,
url:'管理员',
}, {
卫兵:这个。用户卫兵,
url:'用户',
}, {
卫兵:这个,莫德卫兵,
url:'版主',
}].some((配置)=>{
if(config.guard.canActivate(路由、状态)){
如果(state.url!=`/${config.url}`){
this.router.navigate([config.url]);
}
返回true;
}
});
如果(!canGo){
这个.router.navigate(['/404']);
}
归仓;
}
}
路线
导出常量路由:路由=[
{
路径:“”,
canActivate:[CanActivateModuleGuard],
儿童:[{
路径:“用户”,
loadChildren:'app/user/user.module#UserModule',
激活:[
CanActivateUserModuleGuard
],
},
{
路径:“admin”,
loadChildren:'app/admin/admin.module#AdminModule',
激活:[
可以激活AdminModuleGuard
]
},
{
路径:'版主',
loadChildren:'应用程序/版主/版主.模块#版主模块',
激活:[
可激活调节器模块Guard
]
}],
},
{
路径:“404”,
组件:NotFoundComponent
}
];

如果有错误,您可以发布错误堆栈吗?没有错误,但此处的问题是路由检测默认会到达第一条路由路径,而不会通过防护继续到下一条路由。在提供的示例中,它应该重定向到管理模块。谢谢@Teddy Sterne,是否可以使用空url定义路由,这样我就不会破坏每个模块本地路由中的路由配置。带有模块的路由应该能够相对于模块的根,因此它们不需要知道它们是否位于
/admin
/user
/moderator
中。示例
链接