【发布时间】:2020-12-21 02:40:09
【问题描述】:
对于上下文,我有两个守卫在一个有角度的路线上,但我不能让他们都在路线上 canActivate 由于一个副作用以及所有守卫都在一条路线上被检查的事实。
因此,为了解决问题,我有一个守卫在某些情况下调用其他守卫 canActivate:
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
return this.service.state$.pipe(
filter((s) => s.updatedFromServer),
switchMap((s) => {
if (/* a condition that means this guard is satisfied */) {
return this.otherGuard.canActivate(next, state);
} else {
return false;
}
})
);
另一个守卫的 canActivate 返回类型也是 Observable<boolean> | Promise<boolean> | boolean 并且同样可以返回一个实际的布尔值或 Observable。
TS 错误投诉现在是:
Type 'false | Observable<boolean>' is not assignable to type 'ObservableInput<any>'.
Type 'false' is not assignable to type 'ObservableInput<any>'
如果另一个守卫只返回一个 Observable 并且这里的 switchmap 返回也更改为of(false) 那么它似乎没问题,但我更愿意保留可以返回解析布尔值的 canActivate 签名 - 我只是不知道如何在 rxjs 映射的上下文中做到这一点。
【问题讨论】:
-
这个
of(false)不能返回是什么原因? -
switchMap 操作符总是返回一个 observable。所以你需要返回(假)。我不太明白为什么你不能返回一个可观察的布尔值?请您详细说明一下。
-
我可以在这个守卫中回复 of(false),但是另一个守卫在其他地方独立使用,我不想改变它。如果没有更好的方法,我可以 - 只是认为可能有一个 rxjs 运算符可以让我合并布尔值和 Observable
的混合。但是好像没有 -
返回 of(false) 并没有破坏 canActivate 签名。 xxxMap 运算符确实要求您返回一个可观察对象。通过不返回可观察对象,您正在破坏 switchMap 合同本身。您不能在服务本身中包含条件,以便可观察对象可以返回真/假吗?