#ngxs
#ngxs
Вопрос:
Кто-нибудь может объяснить, когда именно вызывается selector
подписка? Мое предыдущее понимание заключалось в том, что всякий раз, когда reducer изменяет state
(создается некоторый diff), вызывается selector
. Но в следующем коде этого не происходит.
Следующий селектор (строка A) не вызывается при отправке SaveVersionSuccess
. В редукторе я меняю state.version.versions[0].updated_fields.workflow
с true
на false
.
Кто-нибудь может объяснить, почему? stackblitz
@Select(state => state.version.versions) version$: Observable<any[]>;
ngOnInit(): void {
this.version$.subscribe((versions) => {//line A
alert()
});
}
test(){
this.store.dispatch([
new SaveVersionSuccess({bot:null, version:{id: 1, updated_fields:{'workflow':false}}})
]);
Редуктор
@Action(SaveVersionSuccess)
SaveVersionSuccess({patchState, setState, getState, dispatch,}: StateContext<ICodeInputState>, {payload}: SaveVersionSuccess) {
let state = getState();
let index = state.versions.findIndex((version) => version.id === payload.version.id);
let index_pristine = state.versions_pristine.findIndex((version) => version.id === payload.version.id);
state.versions[index] = {
...payload.version
};
state.versions_pristine[index_pristine] = {
...payload.version
};
patchState({...state});
}
Начальное состояние
const codeInputState: ICodeInputState = {
versions: [{id: 1, updated_fields:{'workflow':true}}],
versions_pristine: [{id: 1, updated_fields:{'workflow':true}}]
};
Комментарии:
1. Я обычно не использую столько разрушений, но это может быть patchState (состояние); Вы могли бы использовать плагин DevTools и проверять состояние до / после вызова test () . Кстати, что вызывает test()?
2. Эй,
patchState(state)
тоже не помогает. devtools показывают разницу при первом вызове test, как и ожидалось. test() вызывается кнопкой в шаблоне компонента. Я прикрепил ссылку на stackblitz, вы можете проверить, используете ли вы ноутбук. Спасибо.3. попробуйте установить режим разработки в вашем хранилище для инициализации ROOT, чтобы вы могли заморозить свое хранилище с помощью модуля deep-freeze-strict. и посмотрите, не является ли это проблемой мутации
Ответ №1:
Как следует из комментариев, это похоже на проблему с неизменяемостью при исправлении состояния, оригинал изменяет существующее состояние, а не исправляет новое состояние.
Я попробовал эту версию на вашем StackBlitz, похоже, она работает так, как, я думаю, вы хотите:
@Action(SaveVersionSuccess)
SaveVersionSuccess({patchState, setState, getState, dispatch,}: StateContext<ICodeInputState>, {payload}: SaveVersionSuccess) {
let state = getState();
let index = state.versions.findIndex((version) => version.id === payload.version.id);
let index_pristine = state.versions_pristine.findIndex((version) => version.id === payload.version.id);
// Create a new versions array
const versions = [...state.versions];
// Patch the value at the required index
versions[index] = payload.version;
// Create a new versions_pristine array
const versions_pristine = [...state.versions_pristine];
// Patch the value at the required index
versions_pristine[index_pristine] = payload.version;
// Patch the state with the new arrays
patchState({
versions: versions,
versions_pristine: versions_pristine
});
}