我在我的项目中使用@angular-redux/store。我试图用这样的@select()装饰器创建一个警卫:
@select((s: IAppState) => s.user.userInformations.userState) userState$: Observable<number>;和我的canActivate方法如下:
canActivate(route, state: RouterStateSnapshot): Observable<boolean> {
return this.userState$.pipe(map(value => {
if (value === 0)
return false;
return true;
}));
}是什么问题?,userState$总是返回默认值。
,到目前为止,我尝试了什么?,我试图像这样过滤可观察到的:
this.userState$.pipe(skipWhile(val => val === undefined)).subscribe(value => {
console.log('value', value);
});它工作得很好,返回值是我所期望的(在构造函数中)。但我不能在canActivate方法中使用这个方法。我不知道在canActivate中映射数据的最佳方法是什么。
简单地说:我正在寻找一种方法来跳过状态的第一个值(初始值),并在canActivate方法中使用它作为一个Observable<boolean>。
默认情况下,如果可以配置@angular-redux/store以跳过@()装饰符中未指定的/初始化的值,则会更好。
谢谢你的帮助。
发布于 2020-10-05 15:19:19
我找到解决办法了!
我们可以使用Promise来解决这个问题。由于Promise不返回Observable,所以我们应该使用rxjs中的from。最后的代码如下:
@select((s: IAppState) => s.user.userInformations.userState) userState$: Observable<number>;
userStatePromise = new Promise((resolve, reject) => {
this.userState$.subscribe(val => {
if (val !== undefined) {
resolve(val)
}
}, (err) => {
reject(err)
})
})
canActivate(route, state: RouterStateSnapshot): Observable<boolean> {
return from(this.userStatePromise).pipe(map(val => {
if (val === 0) {
// route anywhere you want
return false;
}
return true;
}))
}https://stackoverflow.com/questions/64078445
复制相似问题