2017-07-18 46 views
0

我一直在想方法,我可以維護所有我的減速器執行的所有操作字符串的日誌。首先,這個函數可以打破redux的只讀狀態是有意義的,因爲這個日誌將活在應用程序之外,不應該用於狀態反轉。我認爲服務是理想的,因爲它們是可注入和單身的。我將如何去注入一個服務到我的reducer或以某種方式將操作字符串保存到數組?Angular 2 @ ngrx/redux存儲所有字符串(操作)來創建日誌

下面是我的導航示例簡化器:我如何將一個服務注入到此?

import * as Layout from '../_actions/layout.actions'; 

export interface State 
{ 
    sideNavVisualState: boolean; 
    sideNavWidthPx: number; 
    sideNavMarginLeftPx: number; 
} 

const initialState: State = { 
    sideNavVisualState: false, 
    sideNavMarginLeftPx: 0, 
    sideNavWidthPx: 0 
}; 

export function reducer(state = initialState, action: Layout.Actions): State 
{ 
    switch (action.type) 
    { 
     case Layout.OPEN_NAV: 
      return { 
       sideNavVisualState: true, 
       sideNavWidthPx: 250, 
       sideNavMarginLeftPx: 250 
      } as State; 
     case Layout.CLOSE_NAV: 
      return { 
       sideNavVisualState: false, 
       sideNavWidthPx: 0, 
       sideNavMarginLeftPx: 0 
      } as State; 
     default: 
      return state;  
    } 
} 

export const getSideNav = (state: State) => state; 

回答

0

你不能注入一些在減速,但你可以做的是以下幾點:

  1. 創建日誌服務
  2. 進樣Actions從NGRX(import {Actions} from "@ngrx/effects";
  3. 訂閱(或type)到任何你想要的地方

因此,像這樣:

import {Actions} from "@ngrx/effects"; 
// ...other imports 

@Injectable() 
export class YourLoggerService { 
    public logAllActions$ = this.actions$ 
     .map(action => action.type) 
     .do(actionType => /* ...some logging logic... */); 

    constructor(private actions$: Actions) { 
     this.logAllActions$.subscribe(); 
    } 
} 
0

NGRX已經給你設計。當你的動作被派發到純粹的函數改變狀態(reducer)旁邊時,你還想要發生其他事情嗎?

爲什麼不直接訂閱效果中的相同動作並在那裏記錄?

[更新]

,當然,做注射反之亦然:不是注射行動服務(?你會嘗試這樣做,這樣,新的效果實現) - 爲什麼不注入日誌服務進入效果?

[更新]

NGRX店是這樣工作的:

  1. 你有減速這是純粹的功能,意義,他們創造無副作用。他們所做的只是更新狀態。 (如果將ChangeDetectionStrategy.OnPush和Immutables混合成一個故事,請特別注意'更新'。減速器只訂閱應該改變狀態的動作。例如,Load_Something_From_Server_FINISHED(意思是說,你已經得到了服務器的響應)。在那個動作有效負載中,你將/應該有來自服務器的數據,那就是你的reducer將會更新狀態。

  2. 你有副作用,它也監聽動作,但只有那些啓動有副作用的東西,例如ajax請求。因此,效果會監聽諸如Load_Something_From_Server_STARTREQUEST之類的操作(在這裏,您可以從效果中調用發送實際http請求的服務)。當響應返回時,您使用來自服務器的數據(在操作負載中發送的數據)調度Load_Something_From_Server_FINISHED操作(Reducer監聽)。

  3. 當您考慮日誌記錄時,默認情況下其副作用。因此,無論何時發出某個動作並且減速器對其作出反應(更新後的狀態),您還希望將其保存在某處。沒有什麼能夠阻止你讓這兩個效果和reducer聽同樣的動作,只要你用它們的意思是:reducer用於更新狀態,副作用的效果。

這意味着,當你的行動派,你的減速要聽它更新的狀態和你的效果保存記錄。

+0

我從來沒有使用過的效果,而且在如何使用Redux方面我還是比較新的。你能展示一個非常基本的例子嗎? –

+0

幾個月前我一直處於同樣的狀況。用nrgx概念我完全失去了。對我最有幫助的是全面的解釋。出於這個原因,我不會發布任何代碼,你會在網上找到大量的例子。相反,我會嘗試對整體情況作更多解釋。希望它會有所幫助。 (我已經更新了我的答案) –