Эффект NgRX вызывается с пустым состоянием - PullRequest
0 голосов
/ 13 декабря 2018

У меня возникли некоторые проблемы с состоянием приложения Redux.Допустим, пара действий обновит состояние.Когда запускается эффект NgRX, то внезапно состояние исчезает, и следующее действие, которое идет к редуктору, принимает initialState.

Вот мой эффект:

@Effect() getConfiguration$ = this.actions$.pipe(
    ofType(PlasmaAction.PlasmaActionTypes.GET_CONFIGURATION),
    switchMap((action: PlasmaAction.PlasmaActions) => {
        return this.plasmaService.send(action.payload).pipe(
            map(result => {
            return new PlasmaAction.SetConfiguration(result);
            })
        );
    })
);

Вплоть до отправки действия GET_CONFIGURATIONсостояние в порядке, но тогда состояние выглядит следующим образом: redux-dev-tools-screenshot и состояние пустое.Я что-то упустил?

PS Отправляется SET_CONFIGURATION и обновляет состояние с новой конфигурацией, а все остальные атрибуты возвращаются к исходным.

@ EDIT: Вот мой редуктор.Немного отладки с моей стороны:

export function plasmaReducer(state: PlasmaState, action: PlasmaActions) {
if (!state) {
    console.log('%c STATE IS EMPTY', 'color:red;');
    state = initialState;
}
switch (action.type) {
    case PlasmaActionTypes.CONNECTION_OPENED: {

        return { ...state, connected: true };
    }
    case PlasmaActionTypes.CONNECTION_CLOSED: {
        return { ...state, connected: false };
    }
    case PlasmaActionTypes.SET_CONFIGURATION: {
        return { ...state, configuration: action.payload };
    }
}

}

1 Ответ

0 голосов
/ 13 декабря 2018

Ваш редуктор должен всегда иметь корпус default.

Каждое действие передается через каждый редуктор, загруженный в ваше приложение.Это означает, что если вы не обрабатываете «другие» действия внутри вашего редуктора, редуктор возвращает undefined, следовательно, вы видите пустое состояние.

Для обработки «других» действий используйте случай defaultи просто вернуть состояние как есть:

switch (action.type) {
    case PlasmaActionTypes.CONNECTION_OPENED: {

        return { ...state, connected: true };
    }
    case PlasmaActionTypes.CONNECTION_CLOSED: {
        return { ...state, connected: false };
    }
    case PlasmaActionTypes.SET_CONFIGURATION: {
        return { ...state, configuration: action.payload };
    }

    default:
         return state;
}
...