在 angular 中使用 ng-repeat 防止影响原始对象的 'copied' 更改

Prevent change of 'copied' object affecting original using ng-repeat in angular

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

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

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

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

发生的情况是它删除了复制项和原始项的字段。

笨蛋-

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])); 
 }

我推荐使用angular.copy,这是一个"deep copy"的源对象。这是源对象中的唯一对象。

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

示例:

//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.