Я расширил хранилище состояний @ 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;
}
}