【发布时间】:2019-05-25 00:22:41
【问题描述】:
我正在尝试为未经身份验证的访问者加载我的应用主页。
const routes: Routes = [
{ path: '', loadChildren: './home/home.module#HomeModule' }
...
经过身份验证的用户应该通过该模块获取他们的提要,也在空路径上。
{ path: '', loadChildren: './feed/feed.module#FeedModule', canActivate: [IsAuthenticationGuard] },
{ path: '', loadChildren: './home/home.module#HomeModule', canActivate: [NoAuthenticationGuard] },
我预计IsAuthenticationGuard 会失败并加载默认的主组件。
相反,它会下载 feed 模块包(显示在网络选项卡中),但不会在路由器插座中加载任何内容。很混乱。
如何在空路径上进行条件路由(基于守卫或其他)?
更新:这里是应要求提供的警卫
@Injectable()
export class IsAuthenticationGuard implements CanActivate {
constructor(
private authenticationService: AuthenticationService
) { }
public canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
return this.authenticationService.isAuthenticated.pipe(take(1), map((isAuthentication) => {
return isAuthentication;
}));
}
}
我研究了新的urlTree,现在您可以通过路由重定向而不是在守卫内重定向,这很酷。 但是,如果您尝试将相同的路由与不同的模块一起使用,则重定向似乎不适用。如果有办法,请纠正我。
【问题讨论】:
-
您需要使用
matchers。检查此以获取线索:medium.com/@lenseg1/… -
请向我们展示你的警卫
-
你不能放两个空路径,你应该放一个空并给另一个一个url,然后在守卫中,你可以通过router.navigate进行重定向
-
虽然此功能不存在,但有一个功能请求:github.com/angular/angular/issues/12088
-
解决方案:您可以通过创建路由
matcher来做到这一点。 代码: 我在这里回答:stackoverflow.com/a/67422797/14389830 注意: 在链接的答案中有一个工作示例,并链接了相关的blogs以获取详细信息和演练怎么做。
标签: javascript angular module routing