在Angular2(NgRedux)中使用Redux更新/设置订单条目。是否可以改变代理变量,然后对象。将其指定为状态?
在我的数据缩减器中:
case DataActions.UPDATE_ORDER:
var updatedItem
var updatedState = state.orders
for(var i = 0; i < state.orders.length; ++i) {
if(state.orders[i]['key'] === action.payload.key) {
updatedItem = state.orders[i]
updatedItem.name = action.payload.name
updatedItem.items = action.payload.items
}
}
updatedState[i] = updatedItem
return Object.assign({}, state, {
orders: updatedState
})
答案 0 :(得分:3)
你的“代理变量”只是对同一个对象的另一个引用,所以是的,你 直接改变了那个数组中的项目。
为了正确执行不可变更新,应复制每个嵌套级别。 Redux文档提供了常见错误的示例,以及如何在http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html中正确执行此操作。
答案 1 :(得分:0)
非常感谢@markerikson的解决方案。
我选择了文档的建议并使用了dotProp库。这很有效:
npm install dot-prop-immutable
...
var dotProp = require('dot-prop-immutable');
...
case DataActions.UPDATE_ORDER:
for(var i = 0; i < state.orders.length; ++i) {
if(state.orders[i]['key'] === action.payload.key) {
state = dotProp.set(state, `orders.${i}.name`, action.payload.name)
state = dotProp.set(state, `orders.${i}.items`, action.payload.items)
}
}
return state