2017-03-14 23 views
7

我的問題涉及ngrx 效果減速器我應該在哪裏放置旨在將用於ngrx商店的數據轉換爲效果或縮減器的業務邏輯?

我需要在將數據放入ngrx存儲之前轉換從後端檢索的數據。從後端檢索到的數據是Message一個普通數組(Message是在我的應用程序的自定義類型):

Message[] 

我需要陣列轉變成執行以下操作:

Map<string, Message[]> 

基本上我通過對方(收件人或發件人)ID(密鑰)分組用戶的消息。

我不知道從哪裏Message[]Map<string, Message[]>進行改造:我應該把轉型業務邏輯到@Effect或進入減速功能

回答

4

轉換可以進入效果器或減速器。

如果有任何驗證需要執行,我會把它放在效果中 - 我可以選擇分派錯誤操作。否則,我會把它放入reducer中,因爲這是我通常將動作有效載荷轉換爲狀態的地方。

還有另一種選擇:您可以使用選擇器。也就是說,消息可以作爲一個簡單的數組存儲在狀態中,並且選擇器可以用來轉換狀態的消息,將它們按對方分組 - 或者其他任何東西。如果我有多種分組消息的方式,這是我選擇的選項。

@ngrx/example-app包含selectors一些例子:

/** 
* 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 
+0

謝謝。這使得它更清晰。 – balteo

+0

增加了另一個選項:選擇器。 – cartant

3

我這樣做是爲了獲取並就像昔日在服務轉換數據的方式。

效果對動作做出反應,並通過服務進行調用以獲取數據並根據收到的響應發送其他動作。

這使得測試變得更容易,因爲服務與主要目的是對特定操作做出反應而不是打包數據的效果分開。

減速機可用於這一點,但再一次,你應該保持乾淨爲了提高可讀性

0

我的觀點:從後端檢索

  1. 的數據將在該商店中保持不變。

  2. 使用選擇器作爲愚蠢組件的業務邏輯(合併,轉換等)。

  3. 也許唯一的轉變是使用normalizr來平整數據。

相關問題