Angular Ngrx存储:在ActionReducerMap之外更新公共状态

Angular Ngrx存储:在ActionReducerMap之外更新公共状态,angular,ngrx,ngrx-store,ngrx-effects,Angular,Ngrx,Ngrx Store,Ngrx Effects,我有一个ngrx存储,其初始状态类似于: const state = { child1: {...}, child2: {...}, } 使用ActionReducerMap,如下所示: const reducerMap = { child1: reducer1, child2: reducer2, } const state = { child1: {...}, child2: {...}, loading: false, }

我有一个ngrx存储,其初始状态类似于:

const state = { 
    child1: {...},
    child2: {...},
}
使用ActionReducerMap,如下所示:

const reducerMap = {
    child1: reducer1,
    child2: reducer2,
}
const state = { 
    child1: {...},
    child2: {...},
    loading: false,
}
StoreModule.forFeature('myStore', compose(metaReducer, combineReducers)(reducerMap))
现在,我想在与child1和child2相同的级别上添加一个“加载”状态,以跟踪两个子系统(它们是相互连接的)的加载。为此,我更新了初始状态,如下所示:

const reducerMap = {
    child1: reducer1,
    child2: reducer2,
}
const state = { 
    child1: {...},
    child2: {...},
    loading: false,
}
StoreModule.forFeature('myStore', compose(metaReducer, combineReducers)(reducerMap))
我尝试使用metareducer,它位于reducer1和reducer2的顶部,如下所示:

export function metaReducer(reducer) {
    return function reduce(state, action) {
        switch(action.type) {
            case CommonActionTypes.UpdateLoading: {
                return {
                    ...,
                    loading: action.loading
                }
            }
            default:
                return reducer(state, action);
        }
    }
}
我将其添加到功能存储中,如下所示:

const reducerMap = {
    child1: reducer1,
    child2: reducer2,
}
const state = { 
    child1: {...},
    child2: {...},
    loading: false,
}
StoreModule.forFeature('myStore', compose(metaReducer, combineReducers)(reducerMap))
在应用程序中,我在更新child1和child2的某些效果期间调用UpdateLoading操作。 然而,这并不像我预期的那样有效

  • 首先,初始状态根本不支持“加载”变量——它仍然认为原始状态是
  • 状态中的“loading”变量仅在调用UpdateLoading操作时更新。通过所有后续操作,它将从状态中删除。这很奇怪,因为唯一作用于它的减速器是元减速器,而减速器1和减速器2分别作用于子状态child1和child2

  • 使用meta reducer更新公共状态是正确的方法吗?我如何才能做到这一点?

    尝试在两种情况下使用reducer功能:

    导出功能元减速器(减速器){
    返回函数reduce(状态、动作){
    开关(动作类型){
    案例CommonActionTypes.UpdateLoading:{
    
    返回reducer({/尝试在两种情况下使用reducer函数:

    导出功能元减速器(减速器){
    返回函数reduce(状态、动作){
    开关(动作类型){
    案例CommonActionTypes.UpdateLoading:{
    
    return reducer({//IMO,meta reducer用于在调用reducer之后/之前添加/检查行为。例如,检查不变性。如果您希望在多个状态更改中保留(或不删除)切片,我认为您必须为其创建单独的reducer:
    StoreModule.forRoot({loading:loadingReducer})
    IMO,元减速器用于在调用减速器之后/之前添加/检查行为。例如,检查不变性。如果您希望在多个状态更改中保留(或不删除)切片,我认为您必须为其创建单独的减速器:
    StoreModule.forRoot({loading:loadingReducer})