store.select的ngrx效果

时间:2018-10-04 19:20:17

标签: javascript angular ngrx-effects

是否可以使ngrx/effect监听select操作?例如:

this.store.select('reducer')

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

效果不应该听商店。效果听动作。原因是效果消除了因执行操作而引起的副作用。原因之一是它可以防止在进行时间旅行调试时对API调用等内容进行垃圾邮件处理。如果从商店触发了效果,则会在调试时触发。

效果触发动作,然后触发其他动作。减速器也触发动作。减速器和效果器可以触发相同的动作。

所以您应该做的是代替触发状态之外的动作。触发它的方式与您想要效果触发方式改变状态的动作相同。

答案 1 :(得分:0)

接受的答案完全是错误的。效果可以而且应该由多种可观察对象驱动。

具有这样的效果是完全有效的:

updateEstimatedTimeToShip$ = createEffect(() =>
  this.store.select(selectShippingAddress).pipe(
    switchMap(shippingAddress => this.shippingService.getEstimatedTimeToShip(shippingAddress).pipe(
      map(timeToShip => GetUpdatedEstimatedTimeToShipSuccessful({ timeToShip })
    )
  )
);

当我们采用某种形式用户输入其地址,并且我们想调用进行HTTP调用以获取更新的预计交付时间的服务时,此效果将非常有用。

请注意,我们可以使变更检测逻辑对FormValueChanged动作做出反应...但是,如果有多个动作影响送货地址怎么办?现在我们必须在许多效果中重复逻辑。

我们还可以为表单中的不同字段触发单独的动作,但是为什么当我们已经可以从存储中的数据中进行更改检测时为什么这样做呢?

当效果可以从数据中删除时,让组件负责派发“变更检测”类型的动作对我来说是愚蠢的。

还可以进行时间旅行调试...是的,可以进行API调用!然后,我应该在旅行时设计一个应用程序,还是在旅行时使用浏览器的开发工具禁用联网功能?