【问题标题】:Do Angular routes subscribe to the observable a RouteGuards returns?Angular 路由是否订阅了 RouteGuards 返回的 observable?
【发布时间】:2021-02-05 11:54:15
【问题描述】:

我对 Angular 路由如何处理守卫返回的 observables 感到有些困惑。采取以下路线守卫:

export class AuthenticationGuard implements CanActivate {

  constructor(private sessionQuery: SessionQuery, private router: Router){}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    const loginPage = this.router.parseUrl('/login')

    return this.sessionQuery.loggedIn$.pipe(
      map((loggedIn: boolean): boolean | UrlTree => {
        console.log('loggedIn emitted: ', loggedIn)
        return loggedIn ? true : loginPage
      })
    )
  }
}

如果值为true,则守卫返回一个将this.sessionQuery.loggedIn$ 映射到true 的可观察对象,如果false,则将其映射到loginPage

但是,我希望路由守卫会订阅 observable:this.sessionQuery.loggedIn$ observable,这样当它重新发出时,路由守卫中的逻辑会被重新评估。

但是测试似乎表明它没有。如果我在应用程序的其他地方订阅这个 observable,我可以看到它重新发出,但我在上面的代码中输入的 console.log 调用不会触发。

我希望路由守卫在loggedIn$ observable 发出false 时触发自动注销。

如果路由没有订阅守卫,那么守卫首先返回一个可观察对象有什么意义?我觉得我在这里缺少一些东西......

【问题讨论】:

  • 防止在保护逻辑上检查 URL。路由定义中指定的守卫angular.io/api/router/CanActivate
  • 我也很困惑,你搞清楚了吗?
  • 我不是????确定这个的基本事实,但我得出的结论是,考虑这一点的最有用的方法是假设守卫订阅了 observable,等待第一次发射,然后取消订阅。我的理解是订阅仅在页面加载过程中起作用(如下 Clemens 所述)

标签: angular typescript angular-route-guards


【解决方案1】:

您必须实现“当sessionQuery.loggedIn$ 在其他地方发出 false 时登录路由的逻辑,可能是在急切地注入其父模块的服务中(以确保它被实例化)。

要检查 Angular 对返回的 Observable 做了什么,您可以返回以下内容。我的猜测是,Angular 获得了第一个发出的值并取消订阅。

return new Observable<boolean | UrlTree>((subscriber) => {
    const subscription = this.sessionQuery.loggedIn$.pipe(
      map((loggedIn: boolean): boolean | UrlTree => {
        console.log('loggedIn emitted: ', loggedIn)
        return loggedIn ? true : loginPage
      })
    ).subscribe(subscriber);

    return () => {
        // called when no subscriber is left
        console.log('unsubscribed');
        subscription.unsubsribe();
    };
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多