NgRx - 如何切割状态

时间:2017-05-06 13:59:05

标签: angular rxjs ngrx ngrx-store

我对如何切割每个减速器的各个状态有一些疑问。 在很多在线教程(如this one)中,手动定义了一个根全局状态,它结合了所有称为AppState的单个状态。

当我们将包含所有Reducer的对象文字传递给StoreModule时,是否正确:

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

使用字符串选择器时,对象键r1r2可用于查询状态切片:

store.select("r1")

但是,如果我们想要类型安全,我们定义AppState接口,并确保对象键与传递给NgRx的reducer对象文字的对象键匹配,以便我们可以使用store.select(appstate => appstate.r1)(并且这是AppState接口唯一有用的案例)?

2 个答案:

答案 0 :(得分:4)

要使类型安全以这种方式设置:

export const reducers: ActionReducerMap<AppState> = {
    auth: fromAuth.reducer;
    contacts: fromContacts.reducer;
    events: fromEvents.reducer;
}

每个切片都有它自己的界面。

然后设置缩减器

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

然后在你的app模块中

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

例如,您的身份验证缩减器将按此定义

PATH = "C:\\Users\\JoshLaptop\\PycharmProjects\\practice\\commented.txt"

file = open(PATH, 'r')

words = ['bah', 'dah', 'gah', "fah", 'mah']

print(file.read().splitlines())

if 'bah' not in file.read().splitlines():
    print("fail")

等。每个reducer都由它的键,auth reducer和auth状态调用。

答案 1 :(得分:0)

我认为您必须设置AppState界面。例如,当您依赖注入商店时,您无法执行此操作:

constructor(private store: Store)

商店必须采用如下界面:

constructor(private store: Store<AppState>)

鉴于您必须指定AppState,您可能希望始终使用胖箭头函数来获取AppState切片,因为您获得了类型安全性。

store.select(appstate => appstate.r1)