我有以下页面(简单): 删除项目从Array跳过某些项目
正如你所看到的,在上面我有一个输入,然后<ul>
最后一个按钮来保存更改。我的<ul>
绑定到一列items
。一旦用户点击Uloz zmeny(保存更改)我触发ng-click="vm.SaveChanges()"
它看起来像以下:
vm.SaveChanges = function() {
angular.forEach(vm.items, function (value, key) {
if (value.toRemove == true) {
//remove item from the list
var iIndex = vm.items.indexOf(value);
vm.items.splice(iIndex, 1);
};
});
};
其中vm
被定义为我的代码开头如下:
(function() {
"use strict";
angular.module("app-shopping").controller("itemsController", itemsController);
function itemsController($http) {
var vm = this;
vm.items = [];.....more code after here
每个项目下我的“ “具有以下结构:
{
"id": 2,
"orderId": 2,
"text": "Item 2",
"toRemove": true
},
最后,当用户检查下<li>
我触发的项它只是看起来像这样(它只是改变了从真正的电流项的布尔状态,以虚假或反之亦然):
vm.toggleCompleted = function (sItem) {
sItem.toRemove = !sItem.toRemove;
};
这里谈到的问题:为什么当我运行这段代码它不会删除所有选中的项在数组中?例如在这个特定情况下(见上图),它只会删除Item 2
并跳过Item 3
。我认为问题是由于Item 2
从列表中删除,Item 3
采用已存在的Item 2
的索引并因此被跳过。这个假设是否正确?如果是的话,我该如何改变代码才能运行?
P.S.编辑我的代码为推荐:
<li class="list-group-item" ng-repeat="sItem in vm.items">
<div class="checkbox checkbox-success">
<input id="ListItem{{$index}}" type="checkbox" placeholder="test placeholder" ng-model="sItem.toRemove" ng-click="sItem.toRemove=!sItem.toRemove" />
<label for="ListItem{{$index}}">{{sItem.text}}</label>
</div>
</li>
你可以创建一个plunker吗? – apaul
我认为你的假设是正确的。清除所有项目的巧妙方法是反向循环 - 从最高索引处开始并从那里移除。 – Zach