使用商店的不良做法有效吗?

时间:2018-03-08 16:11:46

标签: angular ngrx ngrx-store ngrx-effects

我有一个InitAction有一些参数,比如个人资料ID和更多数据,这个动作可以用不同的参数调用几次。

除了LoadProfileAction之外,我添加了一个正在收听InitAction并触发LoadProfileAction的效果。

问题是,我只想触发LoadProfileAction,如果配置文件ID与前一个相比发生了变化,那么我认为最佳(?)解决方案是使用withLatestFrom存储在我的效果中并检查当前的个人资料ID。

但是在商店中使用商店感觉是错误的,因为它似乎打破了通量原则或者不是真的吗?还有更好的解决方案吗?谢谢!

1 个答案:

答案 0 :(得分:2)

回答这个问题有点晚,但这也许对那里的人有帮助。我几乎每天都在使用NgRX,我想分享自己的见解。

您绝对可以在特效中使用商店。您只需要通过构造函数导入商店(因为它是依赖关系注入树的一部分),然后可以通过withLatestFrom RxJS运算符在相关效果中使用它。如果您阅读了官方文档,您可能会在effects documentation上看到一条注释,

注意:出于性能的考虑,请结合使用flattening运算符与withLatestFrom来防止触发选择器,直到分派正确的操作为止。

因此理想情况下,您可以通过以下方式使用商店:

createEffect(() => this.actions$.pipe(
  ofType(getSelectedBookDetails),
  concatMap(action => of(action).pipe(
    withLatestFrom(this.store.select(getSelectedBookId))
  )),
  switchMap(([action, selectedBookId]) => this.bookService.getDetails(selectedBookId).pipe(
    map(...),
    catchError(...)
  )
);

其中getDetails()是一个Angular http请求,并返回一个Observable,而getSelectedBookId是一个NgRX选择器。至少我希望您能了解如何使用它,并且将其用于效果完全不是问题。

您还可以确保在执行减速器后执行效果。 This order is guaranteed