从store.select中可观察到的值似乎没有更新

时间:2019-06-26 12:55:54

标签: ngrx ngrx-store

我有一个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));
...

在我的reducer中,我正在像这样处理新状态的创建:

...
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;
}
...

我在组件onInit中订阅了listObj$,但是在初始化时以及在我对数组中的obj进行更改时都得到了服务,我看不到subscribe得到更新的数据< / p>

1 个答案:

答案 0 :(得分:0)

这是“直接”状态突变。

传播运算符(...)不会克隆递归,而Object.assign会突变newState.listObjs[objIndex].someMember

您可以在ngrx v8中安装ngrx-store-freeze或启用运行时检查,并且会收到一个错误,指出您无法像这样修改状态。

要解决此问题,您必须以不变的方式创建新状态,或使用沉浸式。 Clean NgRx reducers using Immer