我有一个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>
答案 0 :(得分:0)
这是“直接”状态突变。
传播运算符(...
)不会克隆递归,而Object.assign
会突变newState.listObjs[objIndex].someMember
。
您可以在ngrx v8中安装ngrx-store-freeze或启用运行时检查,并且会收到一个错误,指出您无法像这样修改状态。
要解决此问题,您必须以不变的方式创建新状态,或使用沉浸式。 Clean NgRx reducers using Immer