储值不更改ngrx

时间:2019-06-03 07:05:32

标签: angular ngrx

我具有以下结构

export interface MyStructure {
  id: string
  values: Array<MyObject>
}

在我的商店中,我有一个调用以下

的操作
const ADD_OBJECT= (state: State, action: featureAction.AddObject) => {
  const vals= state.entities[action.payload.objId].values;
  vals.concat(action.payload.newObj);
  return featureAdapter.updateOne({
    id: action.payload.routeId,
    changes: {
      waypoints : [...vals]
    },
  }, state);
};

但这永远不会更新我的商店...

我也尝试过

    changes: {
      waypoints : new Array<MyObject>
    }

使它起作用的唯一方法是

const ADD_OBJECT= (state: State, action: featureAction.AddObject) => {
  const obj = {...state.entities[action.payload.objId]};
  obj.values= [...obj .values, ...[action.payload.newObj]];
  return featureAdapter.updateOne({
    id: action.payload.objId,
    changes: obj ,
  }, state);
};

但是这太过分了,因为一切都更新了,我不能只更新数组吗?

1 个答案:

答案 0 :(得分:0)

此处vals的变量const vals= state.entities[action.payload.objId].values;引用State中的对象。因此vals.concat(action.payload.newObj);使该对象发生突变。

您不应变异状态

const obj = {...state.entities[action.payload.objId]};之所以有效,是因为spreed创建了一个新的Object(新的引用)。然后NgRx将捕获参考更改并更新状态。