2

我的主应用程序路由器中有以下内容:

{ path: 'users', loadChildren: 'app/modules/users/users.module#UsersModule', canLoad: [AuthGuard] }

当用户访问http://localhost:4200/users/1234查看他们的个人资料时,我会尝试保存完整的 url(包括上面的用户 ID),以便在他们登录后返回该页面.

问题是,函数Route中的参数canLoad只有一个path字段,上面不包含用户ID,只有路径users。有没有办法可以做到这一点?

第一次评论后编辑

用户路由模块确实有一个canActivate守卫,但是除了登录组件之外,它永远不会被调用,因为第一个canLoad返回 false 并将调用者路由到之前的登录组件。

第一次回答后编辑

canLoad(route: Route) {
  if (!AuthService.isAuthenticated()) {
    this.router.events.takeWhile(event => !(event instanceof NavigationCancel))
      .subscribe(event => {
        console.log(event);
        if (event instanceof NavigationCancel) {
          AuthService.setRedirectUrl(event.url);
        }
      });
    return false;
  }
  return true;
}

所以我尝试了上述方法,但我认为我仍然做错了,因为控制台从不记录......我如何NavigationCancel在设置存储重定向 URL 后取消订阅或停止接收事件?

4

1 回答 1

1

由于canLoad在构建路由器状态期间被调用,因此不会获得激活的路由和整个路由器状态。它只获取路线。

您可以将路由器注入警卫,订阅NavigationCancel事件,您可以在其中访问 URL。

设置存储重定向 URL 后,如何取消订阅或停止接收 NavigationCancel 事件?

由于router.events 是 Subject,您可以像这样取消订阅它:

// get the subscription reference
const subscription = this.router.events.takeWhile(event => !(event instanceof NavigationCancel))
      .subscribe(event => {
        console.log(event);
        if (event instanceof NavigationCancel) {
          AuthService.setRedirectUrl(event.url);
          // use it to unsubscribe
          subscription.unsubscribe(); <----------------------------
        }
      });
于 2017-06-11T17:54:25.040 回答