Angular 路由保护法中断路由

Angular 路由保护法中断路由,angular,rxjs,angular2-routing,Angular,Rxjs,Angular2 Routing,编辑:似乎有效,所以似乎还有其他问题 角度6.1.3 我有一条路由需要根据paramslug进行保护 { 路径:'market/:slug', 组件:市场组件, 激活:[角色守卫], }, RoleGuardcanActivate方法: canActivate(路由:ActivatedRouteSnapshot):可观察的|承诺|布尔值{ const market$=this.marketService.getBySlug( route.paramMap.get('slug') );//返回对

编辑:似乎有效,所以似乎还有其他问题

角度6.1.3

我有一条路由需要根据param
slug
进行保护

{
路径:'market/:slug',
组件:市场组件,
激活:[角色守卫],
},
RoleGuard
canActivate
方法:

canActivate(路由:ActivatedRouteSnapshot):可观察的|承诺|布尔值{
const market$=this.marketService.getBySlug(
route.paramMap.get('slug')
);//返回对应市场对象的可观察值
//验证用户是否有权查看此市场。
返回此.authService.isAuthorized(市场);
}
authService.isAuthorized:

未授权(市场:可观察):可观察{
返回CombineTest(this.user$,market).pipe(
地图(([用户,市场])=>{
//根据市场配置检查用户角色
返回true;
})
);
}
我删除了用户/市场逻辑,只是试图去掉可能导致问题的任何东西,但当我在
canActivate
中返回上述方法时,路由停止。路由跟踪:

路由器事件:导航启动
NavigationStart(id:2,url:“/market/sams corner store”)
NavigationStart{id:2,url:“/market/sams corner store”,navigationTrigger:“命令式”,restoredState:null}
路由器事件:路由器已识别
已识别路由(id:2,url:'/market/sams corner store',URLAFTREDICTS:'/market/sams corner store',状态:路由(url:'',路径:''){Route(url:'market/sams corner store',路径:'market/:slug'))
路由识别{id:2,url:“/market/sams corner store”,URLFertRedirects:“/market/sams corner store”,状态:RouterStateSnapshot}
路由器事件:GuardsCheckStart
GuardCheckStart(id:2,url:'/market/sams corner store',urlAfterRedirects:'/market/sams corner store',状态:路由(url:'',路径:''){路由(url:'market/sams corner store',路径:'market/:slug'))
GuardCheckStart{id:2,url:“/market/sams corner store”,urlAfterRedirects:“/market/sams corner store”,状态:RouterStateSnashot}
路由器事件:ChildActivationStart
ChildActivationStart(路径:“”)
ChildActivationStart{snapshot:ActivatedRouteSnapshot}
路由器事件:ActivationStart
ActivationStart(路径:“市场/:slug”)
ActivationStart{snapshot:ActivatedRouteSnapshot}
在正常路由过程中,会触发更多路由器事件,但在这里它只是停止。我认为这与
被授权的
没有发出任何东西有关,但我被难住了。失败后,在任何地方导航都不起任何作用;URL保持不变,其他内容不会记录到控制台

有时甚至没有调用该方法,console.log也不会在
combinelatetest
/
withLatestFrom
中调用


我尝试了将最新的
和最新的
与一些操作符变量组合起来,但没有成功。

你做得很对,但是防护需要可观察的才能完成。 所以你一直在等待

试着做

return this.authService.isAuthorized(market).pipe(
    take(1)
);

这将获取第一个结果并完成,这将解决您的问题。

canActivate guard将订阅返回的Observable,并等待该Observable完成,直到此时不会处理任何其他路由器事件。
first()
(Rx操作员)添加到用户$和市场$Observable。

PS而不是
combinelateest
使用
forkJoin

感谢您对路由器事件的确认。我认为我的实现有点不对劲,但在试图关注这个问题时,这是有帮助的。正如在上面的评论中,我的代码有点不对劲,但在其他测试中,
take
有帮助,谢谢!