16

我的问题与 ngrx效果减速器有关。

我需要先转换从后端检索到的数据,然后再将其放入ngrx 存储。从后端检索的数据是一个普通数组MessageMessage是我的应用程序中的自定义类型):

Message[]

我需要将数组转换为以下内容:

Map<string, Message[]>

基本上,我通过交易对手(收件人或发件人)ID(密钥)对用户的消息进行分组。

我不确定从何处执行转换Message[]Map<string, Message[]>我应该将转换业务逻辑放入@Effect还是放入reducer 函数中?

4

3 回答 3

9

转换可以进入效果器或减速器。

如果需要执行任何验证,我会将其放入效果中 - 我可以选择调度错误操作。

否则,我会将其放入减速器中,因为我通常会将动作有效负载转换为状态。

还有另一种选择:您可以使用选择器。也就是说,消息可以作为一个简单的数组存储在状态中,并且可以使用选择器来转换状态的消息,按交易对手或其他方式对它们进行分组。如果我有多种方式对消息进行分组,这是我会选择的选项。

@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
于 2017-03-14T20:38:15.967 回答
8

我这样做的方式是像过去一样在服务中获取和转换数据。

效果对动作做出反应并通过服务进行调用以取回数据并根据收到的响应调度其他动作。

这使得测试变得更加容易,因为服务与效果分开,主要目的是对特定动作做出反应,而不是打包数据。

Reducer 可用于此目的,但出于可读性目的,您应该再次保持其清洁

于 2017-03-15T14:24:03.597 回答
0

我的意见:

  1. 从后端检索的数据将在存储中保持不变。

  2. 使用选择器作为哑组件的业务逻辑(组合、转换等)。

  3. 也许唯一的转换是使用 normalizr 来扁平化数据。

于 2017-08-04T12:19:35.030 回答