我的应用中有两个模块: HomeModule 和 LoginModule 。
我希望能够在同一路径中加载两个不同的模块。哪个模块加载取决于用户是否登录。
如果用户已登录,则 HomeModule 应为他加载,否则 - LoginModule 应加载。
我尝试了这段代码,控制台没有错误,如果用户登录, HomeModule 会加载,但如果用户没有登录,则无法加载任何内容。如果我颠倒路线的顺序, LoginModule 有效,而 HomeModule 则无效。
HomeGuard .canLoad( )如果用户已登录则返回true, LoginGuard .canLoad()如果用户未登录则返回true。
HomeGuard .canLoad:
if (this.userSessionService.userSession) {
return true;
}
this.router.navigate(['./']);
return false;
LoginGuard .canLoad:
if (this.userSessionService.userSession) {
this.router.navigate(['./']);
return false;
}
return true;
我的路线:
{ path: '', loadChildren: './home/index#HomeModule', canLoad: [HomeGuard] },
{ path: '', loadChildren: './login/index#LoginModule', canLoad: [LoginGuard]}
它应该像Facebook网络应用程序中的主要路线一样工作。如果我去 facebook.com ,如果我没有登录,我会看到登录页面,如果我已登录,我会将应用程序视为已登录用户。
答案 0 :(得分:1)
canLoad
会阻止子项加载,但不会阻止父级匹配路由。
您可以尝试使用网址matcher。这里唯一的问题是匹配器只是一个功能。您可能希望根据服务中的状态返回true
或false
。作为临时方法,您可以尝试使用全局变量作为标志,以查看使用匹配器是否有帮助。
如果匹配器工作,那么我将使用解析器将路由包装在父路由中。解析器将用户状态分配给匹配器使用的全局变量。
{
path: '',
resolver: { ignore: ResolveUserStateForMatcher },
children: [
{ matcher: MatchHomeRoute, loadChildren: './home/index#HomeModule' },
{ matcher: MatchLoginRoute, loadChildren: './login/index#LoginModule' }
]
}
这里的要点是匹配器阻止路由器在用户登录时执行HomeModule
的任何逻辑。这与未加载模块相同。
我不确定MatchResult应该是什么。