如何在效果中访问状态树? (@ ngrx / effects 2.x)

时间:2016-09-19 05:15:47

标签: angular typescript ngrx

我正在将@ngrx/effects从1.x更新为2.x

在1.x中,我可以访问状态树:

/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- bundler (LoadError)
from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/bin/bundle:7:in `<main>'

现在在2.x中,它只给了我动作。还有办法访问状态树吗?或者我应该避免这样使用,因为这不是一个好习惯吗?

    double _number_abs = Math.abs(_newNumber);  

2 个答案:

答案 0 :(得分:23)

另一种方法是使用.withLatestFrom(this.store)。所以完整的代码是:

  constructor(
    private actions$: Actions,
    private store: Store<AppState>
  ) {}

 @Effect() bar$ = this.actions$
    .ofType(ActionTypes.FOO)
    .withLatestFrom(this.store, (action, state) => state.user.isCool)
    .distinctUntilChanged()
    .filter(x => x)
    .map(() => ({ type: ActionTypes.BAR }));

答案 1 :(得分:5)

效果不一定是阶级属性;它们也可以是方法。这意味着您可以访问注入构造函数的商店。

在撰写本回答时,我不清楚属性声明和 public / private 构造函数参数的语义。如果在构造函数之后声明属性,则可以访问通过构造函数参数声明的 public / private 成员 - 因此您不必将效果声明为函数

使用注入商店,您应该能够使用mergeMap之类的运算符来获取状态并将其与您收到的更新结合起来:

@Effect()
bar$(): Observable<Action> {

  return this.actions$
    .ofType(ActionTypes.FOO)
    .mergeMap((update) => this.store.first().map((state) => ({ state, update })))
    .map((both) => {
      // Do whatever it is you need to do with both.update and both.state.
      return both.update;
    })
    .distinctUntilChanged()
    .filter(x => x)
    .map(() => ({ type: ActionTypes.BAR }));
  }
}

我认为这样做是否是一种好的做法是一个意见问题。阅读状态 - 理想情况是通过编写一个ngrx风格的选择器 - 听起来很合理,但如果特定效果所需的所有信息都包含在它正在侦听的动作中,它会更清晰。