Как удалить элемент из массива с фильтром в AngularJS?

Когда я нажимаю 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);
    };

Как обновить индекс в массиве? Или Как удалить правильный элемент?

Ответ 1

Простейшим решением было бы изменить функцию удаления, чтобы принять в проекте вместо индекса.

$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

Ответ 2

Легче объединить ваши проекты в фактическое положение элемента в массиве с помощью 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>