首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带角余量/存储的角保护装置

带角余量/存储的角保护装置
EN

Stack Overflow用户
提问于 2020-09-26 13:51:54
回答 1查看 220关注 0票数 0

我在我的项目中使用@angular-redux/store。我试图用这样的@select()装饰器创建一个警卫:

代码语言:javascript
复制
@select((s: IAppState) => s.user.userInformations.userState) userState$: Observable<number>;

和我的canActivate方法如下:

代码语言:javascript
复制
canActivate(route, state: RouterStateSnapshot): Observable<boolean> {
    return this.userState$.pipe(map(value => {
      if (value === 0)
        return false;
      return true;
    }));
}

是什么问题?userState$总是返回默认值。

,到目前为止,我尝试了什么?,我试图像这样过滤可观察到的:

代码语言:javascript
复制
this.userState$.pipe(skipWhile(val => val === undefined)).subscribe(value => {
  console.log('value', value);
});

它工作得很好,返回值是我所期望的(在构造函数中)。但我不能在canActivate方法中使用这个方法。我不知道在canActivate中映射数据的最佳方法是什么。

简单地说:我正在寻找一种方法来跳过状态的第一个值(初始值),并在canActivate方法中使用它作为一个Observable<boolean>

默认情况下,如果可以配置@angular-redux/store以跳过@()装饰符中未指定的/初始化的值,则会更好。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-05 15:19:19

我找到解决办法了!

我们可以使用Promise来解决这个问题。由于Promise不返回Observable,所以我们应该使用rxjs中的from。最后的代码如下:

代码语言:javascript
复制
  @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;
    }))

  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64078445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档