使用角度中的ng-repeat防止更改“复制”对象影响原始对象

时间:2015-04-17 16:38:05

标签: json angularjs ng-repeat

我在angular中设置了一个名为'items'的json字符串。每个项目都包含一个字段ID数组。通过匹配字段ID,它使用单独的“字段”json字符串为字段提取信息。

 {
  "data": [
    {
      "id": "1",
      "title": "Item 1",
      "fields": [
        1,
        1
      ]
    },
    {
      "id": "2",
      "title": "Item 2",
      "fields": [
        1,
        3
      ]
    },
    {
      "id": 3,
      "title": "fsdfs"
    }
  ]
}

您可以复制或删除项目或字段,这将修改'items'json。

除非我复制一个项目(及其字段),然后选择删除该特定项目的字段,否则一切正常。

它会删除复制的项目和原始项目的字段。

Plunker -

http://plnkr.co/edit/hN8tQiBMBhQ1jwmPiZp3?p=preview

我读过使用'track by'有助于将每个项目编入索引,并防止重复键,但这似乎没有效果。

感谢任何帮助,谢谢

修改

感谢Eric McCormick这个,使用angular.copy和array.push解决了这个问题。

而不是 -

$scope.copyItem = function (index) {
       items.data.push({
            id: $scope.items.data.length + 1,
            title: items.data[index].title,
            fields: items.data[index].fields
        });
}

这很有效 -

$scope.copyItem = function (index) {
 items.data.push(angular.copy(items.data[index])); 
 }

1 个答案:

答案 0 :(得分:5)

我建议使用angular.copy,它是源对象的“深层副本”。这是来源的唯一对象。

它可能看起来有点违反直觉,但是直接引用(当您观察时)与原始对象交互。如果你在DOM中实例化后inspect the element's scope,你可以看到有一个 $ id 属性分配给内存中的对象。基本上,通过使用 angular.copy(source,destination),可以确保复制所有属性/值并拥有唯一对象。

示例:

//inside the controller, a function to instantiate new copy of selected object
this.selectItem = function(item){
  var copyOfItem = angular.copy(item);
  //new item with same properties and values but unique object!
}

Egghead.io有a video on angular.copy