来自 store.select 的 Observable 似乎没有更新值
Observable from store.select doesn't seem to have updated values
我有一个 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;
}
...
我在我的组件 onInit 中订阅了 listObj$
,但它在初始化时得到服务,每当我对数组中的 obj
进行更改时,我没有看到 subscribe
得到更新数据
这是"direct"状态突变。
传播运算符 (...
) 不克隆递归并且 Object.assign
变异 newState.listObjs[objIndex].someMember
.
您可以在 ngrx v8 中安装 ngrx-store-freeze 或启用运行时检查,您将收到一个错误,您无法像这样修改状态。
要解决这个问题,你必须以不可变的方式创建一个新的状态,或者使用 immer。
Clean NgRx reducers using Immer
我有一个 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;
}
...
我在我的组件 onInit 中订阅了 listObj$
,但它在初始化时得到服务,每当我对数组中的 obj
进行更改时,我没有看到 subscribe
得到更新数据
这是"direct"状态突变。
传播运算符 (...
) 不克隆递归并且 Object.assign
变异 newState.listObjs[objIndex].someMember
.
您可以在 ngrx v8 中安装 ngrx-store-freeze 或启用运行时检查,您将收到一个错误,您无法像这样修改状态。
要解决这个问题,你必须以不可变的方式创建一个新的状态,或者使用 immer。 Clean NgRx reducers using Immer