【问题标题】:angular guard with angular-redux/store带 angular-redux/store 的角防护
【发布时间】:2021-01-12 15:14:37
【问题描述】:

我在我的项目中使用 @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$ 总是返回默认值。(可以说未定义)

到目前为止我尝试了什么? 我试图像这样过滤 Observable:

this.userState$.pipe(skipWhile(val => val === undefined)).subscribe(value => {
  console.log('value', value);
});

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

简而言之:我正在寻找一种方法来跳过状态的第一个值(初始值)并在canActivate 方法中将其用作Observable&lt;boolean&gt;

PS如果我可以配置 @angular-redux/store 默认跳过 @Select() 装饰器中的 undefiend/initialed 值会更好。

感谢您的帮助。

【问题讨论】:

    标签: angular redux redux-observable angular-router-guards angular-redux


    【解决方案1】:

    我找到了解决办法!

    我们可以使用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;
        }))
    
      }
    

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 1970-01-01
      • 2016-07-14
      • 2018-03-15
      • 2022-01-14
      • 2019-06-16
      • 1970-01-01
      • 2017-11-21
      • 2019-08-29
      相关资源
      最近更新 更多