我的问题与ngrx 效果和 reducers 。。
我需要在将后端转换为从后端检索到的数据,然后再将其放入NGRX商店。从后端检索到的数据是Message
的普通阵列(Message
是我的应用程序中的自定义类型):
Message[]
我需要将数组转换为以下内容:
Map<string, Message[]>
基本上我是由交易对手(收件人或发件人)ID(键)分组的用户消息。
我不确定在哪里执行从Message[]
到Map<string, Message[]>
的转换:我应该将转换业务逻辑放入 @effect 或 REDUCER函数?
转换可以变成效果或还原器。
如果需要执行任何验证,我将其放在效果下 - 我可以选择派遣错误操作。
否则,我将其放入还原器中,因为这通常是我将动作有效载荷转换为状态的地方。
也有另一个选项:您可以使用选择器。也就是说,这些消息可以作为一个简单的数组存储在该州,并且可以使用选择器来转换州的消息,将其按交易对手分组 - 或其他。如果我有多种分组消息的方式,这是我选择的选项。
@ngrx/example-app
包含一些选择器的示例:
/**
* A selector function is a map function factory. We pass it parameters and it
* returns a function that maps from the larger state tree into a smaller
* piece of state. This selector simply selects the `books` state.
*
* Selectors are used with the `select` operator.
*
* ```ts
* class MyComponent {
* constructor(state$: Observable<State>) {
* this.booksState$ = state$.select(getBooksState);
* }
* }
* ```
*/
export const getBooksState = (state: State) => state.books
我这样做的方式就是像过去一样在服务中获取和转换数据。
效果对动作做出反应,并通过服务进行调用,以获取数据并根据其收到的响应来派遣其他操作。
这使得测试变得更加容易,因为该服务与主要目的是在某个操作中做出反应而不是包装数据的效果。
还可以用于此功能,但您应该再次将其清洁以用于可读性目的
我的意见:
-
从后端检索到的数据将在商店中保持不变。
-
使用Selectors作为您的业务逻辑(组合,转换等)。
-
也许唯一的转换是使用normolizr将数据张开。