我有PolicyGuard一個方法canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)。
在canActivate我創建一個 observable 中,在這個 observable 中我訂閱了一個 Observable,我從我的AbilityService.
我從中檢索的 observableAbilityService偵聽用戶“政策”/“能力”的變化。
當我更改用戶的“策略”并將這些更改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);
}
});
});
}
}
uj5u.com熱心網友回復:
您目前已經創建了一個額外的 Observable,我認為這不是必需的。您可以簡單地this.abilityService.getAbility()使用 RxJSmap運算子回傳并轉換回傳值。這樣 Angular 將接管并處理來自 Observable 的訂閱。
這看起來像這樣:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
console.log("PolicyGuard() - canActivate()");
return this.abilityService.getAbility().pipe(
map(ability => {
const can = ability.can(route.data.action, route.data.subject);
if (!can) {
this.router.navigate(['/home']);
}
return can;
});
);
}
angular.io 上的
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383519.html
上一篇:TS:null不是陣列型別
下一篇:條件泛型的回傳型別不正確
