我正在将@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);
答案 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风格的选择器 - 听起来很合理,但如果特定效果所需的所有信息都包含在它正在侦听的动作中,它会更清晰。