如何从ng-repeat内部的对象中删除元素?

寓言

我正在尝试从一个对象中删除几个元素,但出现错误,该对象位于ng-repeat内部。

错误不允许在转发器中重复。使用“跟踪依据”表达式指定唯一键。中继器:parent.beneficiaries中的子代,重复键:undefined:undefined,重复值:undefined

我在plukr上做了一个简单的脚本:https ://plnkr.co/edit/W2C9ML4dEgJzqj6JeqWC ? p = preview

我的控制器:

angular
  .module("myApp", [])
  .controller("myCtrl", myCtrl);

  function myCtrl(){
    var vm = this;

    vm.classification = [
        {
          "name": "Favoritos",
          "beneficiaries":[
            {
              "idE": "1",
              "type": "Beneficiarios",
              "name": "Alexander Bueno",
              "selected": false
            },
            {
              "idE": "2",
              "type": "Beneficiarios",
              "name": "Lorena Torrealba",
              "selected": false
            },
            {
              "idE": "3",
              "type": "Beneficiarios",
              "name": "Fabián Pernía",
              "selected": false
            }
          ]
        },
        {
          "name": "Mis cuentas",
          "beneficiaries":[
            {
              "idE": "8",
              "type": "Cuentas",
              "name": "Corriente ...1234",
              "selected": false
            },
            {
              "idE": "9",
              "type": "Cuentas",
              "name": "Corriente ...9854",
              "selected": false
            },
            {
              "idE": "10",
              "type": "Cuentas",
              "name": "Ahorro ...9921",
              "selected": false
            }
          ]
        },
        {
          "name": "Terceros",
          "beneficiaries":[
            {
              "idE": "4",
              "type": "Beneficiarios",
              "name": "Alexander Ramírez",
              "selected": false
            },
            {
              "idE": "5",
              "type": "Beneficiarios",
              "name": "Vicente Delgado",
              "selected": false
            },
            {
              "idE": "6",
              "type": "Beneficiarios",
              "name": "Alexis Rodríguez",
              "selected": false
            },
            {
              "idE": "7",
              "type": "Beneficiarios",
              "name": "Ignacio Bueno",
              "selected": false
            }
          ]
        },
        {
          "name": "Tarjetas",
          "beneficiaries":[
            {
              "idE": "11",
              "name": "Visa ...6987",
              "selected": false
            },
            {
              "idE": "12",
              "name": "MasterCard ...7841",
              "selected": false
            }
          ]
        },
        {
          "name": "Servicios",
          "beneficiaries":[
            {
              "idE": "13",
              "name": "Electricidad de Caracas",
              "selected": false
            },
            {
              "idE": "14",
              "name": "C.A.N.T.V",
              "selected": false
            }
          ]
        }
      ];

    //function to delete elements
    vm.deleteElements = function(){
      for(var parent in vm.classification){
        for(var child in vm.classification[parent].beneficiaries){
          //if an element is selected then it will be deleted
          if(vm.classification[parent].beneficiaries[child].selected)
            //this fails if there are more than one element
            delete vm.classification[parent].beneficiaries[child]
        }
      }
    }
  }

我的看法:

<!DOCTYPE html>
<html ng-app="myApp">

  <head>
    <link data-require="[email protected]" data-semver="3.3.6" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" />
    <script data-require="[email protected]" data-semver="1.3.14" src="https://code.angularjs.org/1.3.14/angular.js"></script>
    <script data-require="jquery@*" data-semver="2.2.0" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <script data-require="[email protected]" data-semver="3.3.6" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-controller="myCtrl as ctrl">
    <h1>Elements</h1>
    <a class="btn btn-danger" ng-click="ctrl.deleteElements();">Delete selected elements</a>

    <div class="well" ng-repeat="parent in ctrl.classification">
      <h3>{{parent.name}}</h3>
      <h5 ng-repeat="child in parent.beneficiaries">
        <input type="checkbox" ng-model="child.selected">{{child.name}}
      </h5>
    </div>

  </body>

</html>

那么,我在做什么错呢?

一个更好的奥利弗

使用for ... in循环遍历数组是不正确的,因为它不仅考虑数组的元素。也不用删除数组的元素delete这不会改变数组的大小。

一个相当简单的解决方案是过滤数组:

vm.deleteElements = function(){
  vm.classification.forEach(function (classification) {
    classification.beneficiaries = classification.beneficiaries.filter(function(beneficiary) {
      return !beneficiary.selected;
    });
  });
}

或者,如果浏览器支持ES6:

vm.deleteElements = function(){
  vm.classification.forEach( classification =>
    classification.beneficiaries = classification.beneficiaries.filter(beneficiary => !beneficiary.selected)
  );
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从ImmutableJS中的对象内部的数组中删除元素

如何从ng-repeat中删除此li元素?

如何使用 forEach 从 ng-repeat 中删除 json 对象

从ng-repeat中删除对象

从Angular中的ng-repeat中删除元素后如何更新范围?

如何从React JS(ES6)中的对象内部的数组中删除元素

如何根据对象中的值显示/隐藏ng-repeat中的元素?AngularJS

如何使用AngularJS从ng-repeat中的数组中删除对象?

如何淡出和删除ng-repeat创建的元素

删除Angular中ng-repeat内的所有元素

删除对象中的重复键的AngularJS ng-repeat问题

在 ng-repeat 中单击时如何获取元素的属性

如何处理ng-repeat中的许多元素?

如何在ng-repeat中删除/添加html标签

如何替换使用ng-repeat显示的数组中的对象?

如何从嵌套对象数组中删除元素?

如何从对象向量中删除元素?

如何删除json数组元素中的对象?

在不使用ngAnimate的情况下从ng-repeat中删除元素时如何具有淡出效果?

ng-repeat访问对象内部的数组

如何遍历“ ng-options”属性中对象内部的数组?

如何在mongoDB中删除对象内部的对象?蟒蛇

如何交替执行ng-repeat元素?

如何删除ng-repeat的默认顺序

如何从对象中的数组中删除元素并返回新对象?

如何使用ng-click从数组中删除项目或对象?

嵌套对象上的ng-repeat元素

vector :: erase如何从内部数组中删除所选元素

如何从基于内部文本的列表中删除元素