我有一个InitAction
有一些参数,比如个人资料ID和更多数据,这个动作可以用不同的参数调用几次。
除了LoadProfileAction
之外,我添加了一个正在收听InitAction
并触发LoadProfileAction
的效果。
问题是,我只想触发LoadProfileAction
,如果配置文件ID与前一个相比发生了变化,那么我认为最佳(?)解决方案是使用withLatestFrom
存储在我的效果中并检查当前的个人资料ID。
但是在商店中使用商店感觉是错误的,因为它似乎打破了通量原则或者不是真的吗?还有更好的解决方案吗?谢谢!
答案 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。