2017-05-06 22 views
2

我對每個reducer的單個狀態如何分片有一些疑問。 在大量的在線教程中(如this one),手動定義了一個根全局狀態,該狀態組合了稱爲AppState的所有單個狀態。NgRx - 狀態如何分片

它是正確的說,當我們通過一個包含所有減速到StoreModule對象字面:

StoreModule.provideStore({r1: ReducerFunc1, r2: ReducerFunc2, ...}) 

的對象鍵r1r2可用於使用字符串選擇時要查詢狀態的切片:

store.select("r1") 

然而,如果我們想要的類型安全,我們定義屆時AppState接口,並確保該對象鍵傳遞給NGRX減速對象文本的對象鍵相匹配,這樣我們就可以使用store.select(appstate => appstate.r1)(並且這是AppState接口的唯一有用的例子)?

回答

2

爲了有型的安全設置它是這樣的:

export interface AppState { 
    auth: AuthState; 
    contacts: ContactsState; 
    events: EventsState; 
} 

每片將有它自己的界面。

然後您設置減速

export const reducers: ActionReducerMap<AppState> = { 
    auth: fromAuth.reducer; 
    contacts: fromContacts.reducer; 
    events: fromEvents.reducer; 
} 
您的應用程序模塊中

然後

imports: [ 
    StoreModule.forRoot(reducers), 
], 

你AUTH減速,例如,將像

export function reducer(state: AuthState = initialAuthState, 
         action: Action) { 

這等定義每個reducer都由它的關鍵字,auth reducer和auth狀態來調用。

+0

只有幾行很好的信息。謝謝! – hgoebl

0

我想你必須設置AppState接口。例如,當你的依賴注入的商店,你可以這樣做:

constructor(private store: Store) 

店裏已經採取的接口,像這樣:

constructor(private store: Store<AppState>) 

既然你必須指定屆時AppState你可能想總是使用胖箭頭函數來獲取AppState切片,因爲您獲得了類型安全性。

store.select(appstate => appstate.r1)