如何在AngularJS中使用过滤器从数组中删除项目?

12

当我没有任何过滤器地点击tr时,我的函数array.splice()可以正常工作。数组中的索引按正确顺序排列,因此array.splice()有效。

当启用过滤器时,数组中的索引不会更新,仍然保持原来的顺序。因此array.splice()会删除错误的项。

    <span ng-click="orderP0 = 'statut_name'; reversePO=!reversePO">order</span>

    <tr ng-repeat="project in projects | orderBy : orderPO : reverse track by $index" ng-click="remove($event,$index,projects)">
        <span class="label" ng-bind="project.statut_name"></span>
    </tr>

    $scope.remove = function($event,index,array){
        array.splice(index,1);
    };

如何更新数组中的索引?或者如何删除右侧的项?


你不能只是将项目传递给函数吗?例如:ng-click="remove(project)" - Shawn C.
2个回答

22

使用indexOf在数组中找到元素的实际位置,更容易拼接你的项目。

$scope.remove = function(project){
    $scope.projects.splice($scope.projects.indexOf(project),1);
}

这种方式只需要将当前项目传递给删除函数。

<tr ng-repeat="project in projects | orderBy : orderPO : reverse track by $index" ng-click="remove(project)">
    <span class="label" ng-bind="project.statut_name"></span>
</tr>

这应该是被接受的答案,它不必循环遍历数组。 - Tillman32
老兄,你真是救星啊!我整天都在为这个问题苦恼。 - Sboniso Marcus Nzimande

8
最简单的解决方案是将您的删除函数更改为接受项目而不是索引。
$scope.remove = function(project){
    for(var i = $scope.projects.length - 1; i >= 0; i--){
        if($scope.projects[i].statut_name == project.statut_name){
            $scope.projects.splice(i,1);
        }
    }
}

示例Plunker:http://plnkr.co/edit/51SNVMQjG3dsmpYI5RyY?p=preview

这是一个展示IT技术的示例网站,您可以在该网站上查看和编辑相关代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接