store.select 的 ngrx 效果

ngrx effects for store.select

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

this.store.select('reducer')

有什么建议吗?

效果不应该听商店的。效果监听动作。原因是效果消除了由执行操作引起的副作用。 一个原因是它可以防止在时间旅行调试时像 API 这样的调用被发送垃圾邮件。如果从商店触发效果,它会在调试时触发。

效果触发动作,进而触发其他动作。 reducer 也会触发动作。 reducer 和 effect 可以触发相同的动作。

所以你应该做的是不要触发状态之外的动作。通过以您希望效果触发的方式改变状态的相同动作触发它。

效果可以由多种 Observable 驱动。

使用这样的状态是有效的:

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

updateEstimatedTimeToShip$ 在我们有某种形式让用户输入他们的地址的情况下会很有用,我们想调用一个服务来进行 HTTP 调用以获取更新的预计发货时间。

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

我们也可以为表单中的不同字段触发单独的操作,但是既然我们已经可以从商店中的数据进行变化检测,为什么还要这样做呢?

Having components be responsible for dispatching "change detection"-type actions seems superfluous to me when selectors seem purpose-built for change detection.