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