【发布时间】:2016-07-11 17:10:56
【问题描述】:
如您所见,在顶部我有一个输入,然后是<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(),它看起来像这样(它只是将当前项目的布尔状态从真更改为假,反之亦然):
vm.toggleCompleted = function (sItem) {
sItem.toRemove = !sItem.toRemove;
};
问题来了:为什么当我运行这段代码时,它没有删除数组中的所有选中项?例如,在这种特定情况下(见上图),它只会删除Item 2 并跳过Item 3。我相信这个问题是由于当Item 2 从列表中删除时,Item 3 采用已经存在的Item 2 的索引,因此被跳过。这个假设正确吗?如果是,我需要如何更改代码才能使其运行?
附:按照建议编辑我的代码:
<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 吗?
-
我认为你的假设是正确的。删除所有项目的一个聪明方法是反向循环 - 从最高索引开始并从那里删除。
标签: javascript jquery arrays angularjs