【发布时间】:2022-01-19 20:13:56
【问题描述】:
我有一个 PolicyGuard 和一个方法 canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)。
在 canActivate 中,我创建了一个 observable,并在这个 observable 内部订阅了一个从 AbilityService 检索到的 Observable。
我从 AbilityService 检索到的 observable 监听用户“策略”/“能力”的变化。
当我对用户的“策略”进行更改并使用 Socket.io 将这些更改推送到客户端时,这会变得非常混乱,因为当我不希望它发生时,可能会发生页面重定向到主页(一个订阅运行obs.next(true),而另一个订阅路由回家并运行obs.next(false))
有没有一种方法可以让我在离开订阅的页面时取消订阅?
@Injectable()
export class PolicyGuard implements CanActivate {
constructor(protected router: Router, private abilityService: AbilityService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
console.log("PolicyGuard() - canActivate()");
return new Observable<boolean>(obs => {
const observable = this.abilityService.getAbility();
observable.subscribe(ability => {
const can = ability.can(route.data.action, route.data.subject);
if (can) {
obs.next(true);
}
else {
this.router.navigate(['/home']);
obs.next(false);
}
});
});
}
}
【问题讨论】:
-
在订阅前使用管道尝试 rxjs take(1)。它将需要一次发射并取消订阅
-
我试过了。这样做的问题是,如果您位于应用程序中您不再有权访问的页面上(由于用户策略正在更新),那么该页面不会将您踢回首页。我正在考虑以某种方式使用诸如 takeUntil() 或 takeWhile() 之类的东西,但不确定使用什么作为条件。
标签: angular typescript routes observable angular-route-guards