Angular - 使用 NGRX / Effects 加载特定项目的数据

Angular - Loading data for a specific item with NGRX / Effects

我有一个包含产品列表的页面。这些产品驻留在商店中并由 products reducer 管理。调度一个 PRODUCTS.LOAD_ALL 动作,一个效果捕获它,执行一个 API 调用并调度一个 PRODUCTS.LOAD_ALL_SUCCESS 动作,products reducer 用来填充商店。

我现在有另一个用于编辑特定产品的页面,我对加载/存储该产品的最佳位置有一些疑问。我是否应该坚持使用效果并发送一个动作以最终在商店中获得它。如果是这样,我会用 active 属性 重用 products reducer 还是会引入一个新的 product reducer 来容纳这个特定产品?或者,此时我是否应该放弃表单效果,只从我的容器组件中调用 API 并将产品传递给必要的子组件?

Should I stick with effects and dispatch an action to eventually get it in the store?

是的。

为什么?

因为这样您的所有组件都可以继续依赖商店和有效数据。 - 每当用户完成编辑时,应该会发生以下数据流:

  1. 在您的编辑组件中,用户编辑了产品的副本
  2. 用户点击“保存”(或保存在 input.blur,等等)
  3. 使用 PRODUCTS.SAVE_PRODUCT
  4. 调度一个动作
  5. 效果将调用服务方法来保存新更改(rest-call 或 localstorage 等)
  6. 当持久化成功时 -> reducer 获取新产品对象的动作并将其放入商店
  7. 所有当前订阅商店更新的组件将被自动通知

If so, would I reuse the products reducer with an active property or would I introduce a new product reducer to hold this specific product?

如果您的产品数组已经包含所有产品的所有详细信息,我建议使用那里的数据 - 但请记住:永远不要直接从商店编辑​​商店数据,只能处理副本(这可以通过使用不可变来强制执行,以防你还没有这样做)


Alternative, should I step away form effects at this point and just call the API from my container component and pass the product down to the necessary children?

Heeell 不......我的意思是......从技术上讲是的,你可以 - 但你实际上会失去 ngrx-store 带来的关于干净数据流、数据完整性等的所有好处......

根据应用程序(尤其是小型应用程序)的不同,可以肯定的是,在某些情况下,ngrx 只会带来代码开销而没有真正的好处 - 因此没有 “适用于所有情况的完美方法”。 =44=] - 但我强烈建议 不要 使用一堆只会弄乱代码库的解决方案。