我有一个对象数组:
var items = [{id:1,name:'one'},{id:2,name:'two'}];
然后我选择一个并制作副本:
var item = items[0];
var copy = angular.copy(item);
然后我改变了一个属性:
item.name = 'changed';
有什么价值?
console.log(item.name); // changed
console.log(items[0].name); // changed
数组元素与item
是相同的对象引用,因此属性是相同的。
现在我要撤消副本中的更改:
item = angular.extend(copy);
有什么价值?
console.log(item.name); // one
console.log(items[0].name); // changed
通过使用.extend
,我以为我在item
上设置属性,而不是更改对象引用,所以我期望数组项仍然是与{相同的对象引用{1}}因此具有相同的item
属性,即'one'。
出了什么问题?
答案 0 :(得分:1)
如果查看angular.extend
,则需要两个参数dst
和src
。它会将src
对象复制到dst
,对吗?所以,在这种情况下,而不是做以下事情,
item = angular.extend(copy);
你应该做的是,
item = angular.extend(items, copy)[0];
这是代码段:
var app = angular.module('myapp', []);
app.controller('MainCtrl', function($scope) {
var items = [{
id: 1,
name: 'one'
}, {
id: 2,
name: 'two'
}];
var item = items[0];
var copy = angular.copy(item);
item.name = 'changed';
console.log(item.name); // changed
console.log(items[0].name); // changed
console.log("===================");
item = angular.extend(items, copy)[0];
console.log(item.name); // one? (nope!)
console.log(items[0].name); // changed
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myapp" ng-controller="MainCtrl">
</div>
答案 1 :(得分:0)
我认为我需要的是:
Object.assign(item, copy);