angular универсальный после состояния сервера импорта, @ ngrx / store / update-redurs action wipes store

В универсальном проекте angular в режиме ssr после успешного импорта переданного состояния в хранилище следующее отправленное действие @ngrx/store/update-reducers стирает хранилище. На самом деле запущено несколько @ngrx/store/update-reducers действий (> 10).

Проверка в @ ngrx / store-devtools (расширение chrome) неверно показывает, что хранилище после @ngrx/store/update-reducers все еще заполнено данными, но это неправда, я вижу, что ранее загруженные данные в cmp исчезают через мгновение (когда это упомянутое действие срабатывает).

Это происходит только в режиме ssr, хотя несколько @ngrx/store/update-reducers все еще присутствуют в @ ngrx / store-devtools в классическом ng serve.

deps: angular 5.2.7, @ ngrx / {store, effects, store-devtools, router-store} 5.2.0, chrome 66


person Petr Marek    schedule 15.06.2018    source источник


Ответы (1)


Обычно @ngrx/store/update-reducers добавляет редукторы из лениво загружаемых функциональных модулей. Таким образом, я предполагаю, что в вашем случае несколько функциональных модулей загружаются лениво.

Скорее всего, происходит то, что переданное состояние устанавливается до добавления редукторов для ленивых загружаемых модулей. По умолчанию ngrx очищает все части состояния, которым не назначены редукторы (это делается в функции combineReducers, которая запускается при каждом отправленном действии).

Возможные решения:

1. Назначьте редукторы по умолчанию в корневом модуле для функциональных модулей

StoreModule.forRoot(initialReducerMap, { initialState: getInitialState })
export function defaultReducer(state) { return state; }

export const initialReducerMap = {
    // this will make sure `feature1` and `feature2` parts are not cleared on next action
    feature1: defaultReducer,
    feature2: defaultReducer
} as ActionReducerMap<ApplicationState>;


export function getInitialState() {
    return {
        feature1: feature1.initialState,
        feature2: feature2.initialState
    };
}

Подробнее см. в этом сообщении блога

2. Ручная установка переданных частей состояния для модулей с отложенной загрузкой

import { ActionReducer, UPDATE } from "@ngrx/store";

let transferedState: any;
export function stateSetter(reducer: ActionReducer<any>): ActionReducer<any> {
  return function(state: any, action: any) {
    if (action.type === 'SET_ROOT_STATE') {
      transferedState = action.payload;
      return action.payload;
    }

    // on "update-reducers" set their initial transfered state
    if (action.type === UPDATE && transferedState && action.features) {
        const features: string[] = (action as any).features;
        const newState = { ...state };
        for (const feature of features) {
            newState[feature] = newState[feature] || transferedState[feature];
        }
        return reducer(newState, action);
    }

    return reducer(state, action);
  };
}

Другое

См. эту проблему с github

person Pavel Gurecki    schedule 09.05.2019