从列表角度js中删除多个选定的项目

时间:2015-12-02 16:52:18

标签: angularjs

我正在尝试以角度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;
                }
            }
        };
    };

1 个答案:

答案 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内部迭代。