Angular .extend更改对象引用

时间:2017-03-24 06:41:19

标签: angularjs

我有一个对象数组:

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'。

出了什么问题?

2 个答案:

答案 0 :(得分:1)

如果查看angular.extend,则需要两个参数dstsrc。它会将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);