Наблюдаемый из store.select не имеет обновленных значений - PullRequest
0 голосов
/ 26 июня 2019

У меня есть ApplicationState, в котором есть project член, а мой ProjectState выглядит примерно так:

interface ProjectState {
   listObjs: SomeType[];
}

В моем component.ts onInit у меня есть что-то вроде этого:

...
this.objID = someString
...

this.listObj$ = 
this.store.select( state => state.project.listObjs.find( item => item.id === this.objID));
...

В моем редукторе я обрабатываю создание нового состояния следующим образом:

...
case (action.ACTION1): {

    const newState = {... state};
    const objIndex = state.listObjs.findIndex( item => item.id === action.payload.id )

    if ( objIndex === -1 ) {
        return state;
    }

    Object.assign(newState.listObjs[objIndex].someMember, {... action.payload.someData});

    return newState;
}
...

Я подписался на listObj$ в моем компоненте onInit, но он обслуживается при инициализации, и всякий раз, когда я делаю изменения в obj в массиве, я не вижу subscribe, получающего обновленные данные

1 Ответ

0 голосов
/ 26 июня 2019

Это "прямая" мутация состояния.

Оператор распространения (...) не клонирует рекурсив и Object.assign мутирует newState.listObjs[objIndex].someMember.

Вы можете установить ngrx-store-freeze или включить проверки во время выполнения в ngrx v8, и вы получите сообщение об ошибке, что вы не можете изменить подобное состояние.

Чтобы решить эту проблему, вам нужно создать новое состояние неизменным образом или использовать immer. Очистите редукторы NgRx, используя Immer

...