Angular 7:如何检测NavigationCancel的原因

时间:2019-02-21 09:31:24

标签: angular navigation router guard msal

类似的东西告诉我发生了NavigationCancel事件,但我想知道,是什么触发了该事件:

例如AppComponent(摘录):

constructor (
  ....
  private router: Router
)  {
     router.events.subscribe(e => {
       if (e instanceof NavigationCancel) {
         // PLEASE TELL ME, WHO DID CALL ME ? <---
       }
     });
   }

每当我刷新浏览器时,某种东西(后卫,msal等)都会删除该路由,而上次访问的路由都消失了。目前无法进行深层链接。

一种解决方法是:我必须将最后一条路由保存在LocalStorage中,并强制应用程序切换到该路由。也许如果我能找到触发器,也许我会找到另一个解决方案。

3 个答案:

答案 0 :(得分:1)

创建一种在警卫失败时得到通知的服务可能对您有用。

如您所见here,您无法钩住路由器服务,因此警卫队需要一些样板代码。如果返回错误,请致电您的服务,该服务将存储保护错误。

别忘了删除导航启动事件中的错误。

您可以向Angular团队发出功能请求以创建此类挂钩,以获取防护错误。

答案 1 :(得分:-1)

除了使用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的示例。

答案 2 :(得分:-2)

NavigationCancelCanLoadCanActivate防护阻止子路由加载时发生。如果要调试路由器事件,请将enableTracing: true添加到RouterModule configuration中。另外,NavigationCancel有一个reason property,其中可能包含有用的信息。