如何正确使用带有 angular 服务的 ngrx

how to use ngrx with angular services properly

开始学习 angular,但不确定如何使用 ngrx 构建结构。

简单来说,我有一个服务,其中有两个数组,以及以特定方式操作这些数组的方法。我创建了服务,导致多个组件需要处理数组的逻辑。其中一些将使用其中一个数组的相同状态,一些将具有不同的状态。

不同的组件将访问此服务,对数组进行更改并将数组返回以呈现。然而在网上做了研究之后,似乎常见的做法是保持服务无状态。然后我遇到了 ngrx 商店。

所以我想我可以把数组放在主存储中而不是放在服务中,所以它变成了:

组件会使用服务,操作数组,服务会触发一个动作,然后store会通知组件数组变化

但是查看 ngrx 中的图表 https://ngrx.io/generated/images/guide/store/state-management-lifecycle.png。组件和服务之间会有一个箭头,当应用程序变大时,这似乎会造成混乱。

那么我该如何处理呢?我在这里误解了什么吗?也许服务应该是一个组件(但阅读 https://angular.io/guide/styleguide#delegate-complex-component-logic-to-services,我似乎做对了,将逻辑从组件移到服务,使组件简单)。

非常感谢任何建议

尝试帮助您理解 NgRx 和设计最适合您的架构的一些技巧:

你应该只有 一个单一的真实来源。这意味着仅将原始数据保留为状态。在这里区分同一数据的多个视图或原始数据的变异很重要。

State 通过 Actions 转变为 reducer 函数。这些纯函数(reducer)将状态 A 转换为状态 B。 例如:将新项目添加到您的数组中。

Select 或专用于 select(提取)存储中的数据切片。您可以考虑数据库(状态)和 SQL Select (selectors).

这意味着您可以检索数组的数据子集、过滤、排序...以满足特定组件的需要。 也是多个状态切片的组合,作为新类型返回。

有了 NgRx,服务有时确实失去了一些战略作用。根据我的观点和经验,服务主要用于对 api 后端的外部请求。

转换逻辑在reducer中,应该保持简单。 提取逻辑(视图)在 selectors.

为了保持组织的清晰和可维护性,例如更喜欢单独的文件:

  • 我的-state.reducer.ts
  • 我的-state.selectors.ts
  • 我的-state.actions.ts ...

您还应该区分两种类型的组件:

  • 转储组件:只有UI个组件,没有任何逻辑,没有对NgRx、状态、服务的调用或依赖……只是@Input,和 @Output 简单数据。

  • 容器或智能组件:将它们想象成交通控制塔。它们依赖于 NgRx,它们可以分派操作,并订阅状态更新(通过 selectors)。他们在从 select 或转储组件检索的数据之间组织 link。