Angular两个模块具有相同的路径

时间:2018-06-05 18:21:45

标签: angular angular-ui-router

我的应用中有两个模块: 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 ,如果我没有登录,我会看到登录页面,如果我已登录,我会将应用程序视为已登录用户。

1 个答案:

答案 0 :(得分:1)

canLoad会阻止子项加载,但不会阻止父级匹配路由。

您可以尝试使用网址matcher。这里唯一的问题是匹配器只是一个功能。您可能希望根据服务中的状态返回truefalse。作为临时方法,您可以尝试使用全局变量作为标志,以查看使用匹配器是否有帮助。

如果匹配器工作,那么我将使用解析器将路由包装在父路由中。解析器将用户状态分配给匹配器使用的全局变量。

 {
    path: '',
    resolver: { ignore: ResolveUserStateForMatcher },
    children: [
         { matcher: MatchHomeRoute, loadChildren: './home/index#HomeModule' },
         { matcher: MatchLoginRoute, loadChildren: './login/index#LoginModule' }
    ]
 }

这里的要点是匹配器阻止路由器在用户登录时执行HomeModule的任何逻辑。这与未加载模块相同。

我不确定MatchResult应该是什么。