如何在Angular中使用splice从列表中删除项目?

时间:2013-11-05 07:09:44

标签: javascript arrays function angularjs loops

模板如下所示:

<tr ng-repeat="revision in revisions" id="revision_{{revision.id}}">
    <td><a href="#/wiki/revision/{{ revision.id }}">{{ revision.title }}</a></td>
    <td>(<a href="#/wiki/revision/edit/{{ revision.id }}">Edit</a> | </td>
    <td><a ng-click="revisionDisappear($index)">Delete</a>)</td>
</tr>

和控制器是这样的:

$scope.revisionDisappear = function($index) {
    $scope.revision.revisions[0].splice($index, 1);
};

我得到的错误是:Cannot read property 'revisions' of undefined所以我认为问题出在控制器的某个地方。你能不能告诉我这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

根据您的ng-repeat函数判断,您的范围包含revisions数组,ng-repeat遍历它们,并使用表示revisions中每个项目的修订变量创建隔离范围。

看起来您的控制器不在ng-repeat范围内,因此它看不到包含单个revision实例的范围,但它确实看到了原始的revisions数组,因此您应该只能直接splice

 $scope.revisions.splice($index, 1)

答案 1 :(得分:0)

您可能还想查看商品的ID ...

向您的系统报告已做出更改也是明智的 - 这是迈向事件驱动架构的第一步。

在这种情况下,您的代码可能如下所示:

HTML:

<td><a ng-click="revisionDisappear(revision)">Delete</a>)</td>

JS:

$scope.revisionDisappear = function(revision) {
    for(var i = 0, len = $scope.revisions.length; i < len; i++){
        if($scope.revisions[i].id === revision.id){
            var removed = $scope.revisions[i].splice(i, 1);  // returns an array
            $scope.$emit('myRevisionModule://removed/revision', removed[0]);
            break; // !!!
        }
    }
};

在循环内部调用数组break;之后,splice非常重要。也就是说,如果删除nth项,则循环将继续下一次迭代 - 但是,最后一项已被删除,因此引用undefined之外的属性会引发Type Error

希望这有帮助!