Селектор @ ngrx / Properiy не срабатывает при изменении пользовательского состояния - PullRequest
0 голосов
/ 14 сентября 2018

Я расширил хранилище состояний @ ngrx / entity, добавив в него значение загрузки для объектов, которые должны быть получены с сервера.

const adapter = createEntityAdapter<A>();
export interface AState extends EntityState<A> {
  loading: {
    projects: {
      [id: string]: boolean
    },
    collections: {
      [id: string]: boolean
    }
  };
}
const initialState: AState = adapter.getInitialState({
  loading: {
    projects: {},
    collections: {}
  }
});

Чтобы отобразить это значение загрузки, я использую этот селектор:

export const getRunsLoadingByProject = createSelector(
  (state: AppState) => state.a,
  (state: AState, Id: number) => {
    return !!state.loading.projects[Id];
  }
);

Отлично работает при первой загрузке.Ениты и значения загрузки обновляются, и селектор работает как шарм.Проблема происходит с кнопкой «обновить», которая мне нужна на сайте.Как только состояние объекта, поступающего с сервера, совпадает с состоянием, уже имеющимся в хранилище, селектор прекращает получение новых состояний загрузки.Используя devtools, я вижу, что состояние изменяется правильно (для флага загрузки устанавливается значение true, а затем false).

Это просто селектор.Является ли это причудой @ ngrx / entity, которую селектор запускает только при изменении сущностей?Или я что-то упустил?

Редактировать: Редуктор

export function aReducer(state: AState = initialState, action: AEffectsActions): RunState {
  switch (action.type) {
    case AEffectsActionTypes.LOAD_RUN: {
      const newState = { ...state };
      newState.loading.projects[action.payload.toString()] = true;
      return newState;
    }
    case AEffectsActionTypes.LOAD_RUN_SUCCESS: {
      const newState = adapter.addMany(action.runs, state);
      newState.loading.projects[action.projectId] = false;
      return newState;
    }
    default:
      return state;
  }

} 

1 Ответ

0 голосов
/ 14 сентября 2018

Оператор спреда только "клонирует" на верхнем уровне, ваш селектор не выполняется, потому что ссылка на loading.projects остается прежней.

Так что вам придется сделать что-то вроде следующего.

return {
   ...state,
   loading: {
      ...state.loading,
      projects: {
        ...state.loading.projects,
        [action.payload.toString()]: true
      }

   }
};
...