我正在尝试以角度js删除列表中的一个或多个所选项目。
我尝试按以下方式添加项目:
$scope.selectedNodes = [];
$scope.addItem = function(e) {
$scope.selectedNodes.push({
id :$scope.selectedNodes.length + 1,
Nodeid: e.item.id,
title: e.item.text});
$scope.$apply();
}
html如下:
<select ng-model="selectedItems" multiple ng-multiple="true">
<option ng-repeat="node in selectedNodes" value="{{node}}">{{node}}</option>
</select>
<button ng-click="remove(selectedItems)" type="submit">
Remove
</button>
上面的html列出的所有项目都很好。
现在我正在尝试从列表中删除一个或多个项目,因此我编写的代码是:
$scope.remove = function (nodes) {
alert(nodes); // it's giving the selected records info, no problem with it
angular.forEach(nodes, function (node) {
var index = $scope.selectedNodes.indexOf(node);
alert(index) //problem here, it's always -1
$scope.selectedNodes.splice(index, 1);
});
};
如果选择了一个项目,上面的代码将删除最后一个项目。如果选择了多个,请说两个,然后删除最后两个记录。 任何编号的索引值始终为-1。 foreach循环中的迭代次数。 任何人都可以帮助上面的代码删除一个或多个选定的记录,列表应该刷新。刷新上述代码没问题。
我试着按照你的提法,但没有运气。
$scope.remove = function (nodes) {
alert(nodes); // it's dispalying correct results
for(var i = 0; i< nodes.length; i++)
{
alert(nodes.length); // correct result, no problem
alert(nodes[i]); //correct result, no problem
alert(nodes[i].Nodeid); // problem, value Nodeid is Undefined
for (var idx = 0; idx < $scope.selectedNodes.length; idx++) {
alert($scope.selectedNodes[idx].Nodeid);
if ($scope.selectedNodes[idx].Nodeid == nodes[i].Nodeid) {
$scope.selectedNodes.splice(idx, 1);
break;
}
}
};
};
答案 0 :(得分:0)
您正在尝试使用indexOf定位节点,indexOf使用严格的'==='运算符比较值,并且您尝试比较对象。
我认为你可以更容易地使用众多库中的一个进行集合操作(lodash,下划线等),但是如果你想这样做那么这就是代码:
$scope.remove = function (nodes) {
angular.forEach(nodes, function (node) {
for (var idx = 0; idx < $scope.selectedNodes.length; idx++) {
if ($scope.selectedNodes[idx].Nodeid == node.Nodeid) {
$scope.selectedNodes.splice(idx, 1);
break;
}
}
});
};
如果要删除的节点数非常多并且您关注优化,那么您可以按相反的顺序迭代selectedNodes数组,如果它位于nodesToDelete集合中则删除该节点。代码结构类似,只是在selectedNodes之外和nodesToDelete内部迭代。