【发布时间】: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