这样的事告诉我发生了NavigationCancel
事件,但我想知道,无论触发了什么:
例如AppComponent(摘录):
constructor (
....
private router: Router
) {
router.events.subscribe(e => {
if (e instanceof NavigationCancel) {
// PLEASE TELL ME, WHO DID CALL ME ? <---
}
});
}
如果我刷新浏览器,那么每次都会删除路由(警卫,邮件等等),最后访问的路由消失了。深层链接目前是不可能的。
解决方法是:我必须保存LocalStorage中的最后一个路由并强制应用程序切换到该路由。也许如果我能找到触发器,也许我会找到另一个解决方案。
创建在防护失败时通知的服务可能对您有用。
正如你所看到的那样here你无法勾选到路由器服务,因此需要一些样板代码来保护。如果它返回false,则调用您的服务,该服务存储警卫错误。
不要忘记删除导航开始事件中的错误。
您可以为Angular团队发出功能请求以创建此类挂钩,以便能够获得警卫错误。
而不是boolean
,你也可以使用额外的参数从守卫返回UrlTree
。因此,如果您重定向到/home
,您可以这样做:
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (!this.authService.isLoggedIn) {
return this.router.createUrlTree(['/home', { message: 'You shall not pass' }]);
} else {
return true;
}
}
然后你可以用message
在目标位置读取这个ActivatedRoute#params
。
例子来自here。
NavigationCancel
发生在CanLoad
或CanActivate
防护装置阻止儿童路线装载时。如果要调试路由器事件,请将enableTracing: true
添加到RouterModule
configuration。此外,NavigationCancel
有一个reason
property可能有用的信息。