orderBy之后Angularjs错误$ index

我是Angular.js的新手,在sorting数组和处理这些sorting后的数据时遇到一些问题。

我有一个项目列表,并希望通过“Store.storeName”,这是迄今为止的工作。 但sorting后的数据,我的删除function不再工作。 我认为这是因为$索引sorting后错误,所以错误的数据被删除。

我该如何解决这个问题? 在范围内而不是在视图中sorting数据? 怎么做?

这里是一些相关的代码:

在视图中:

<tr ng-repeat="item in items | orderBy:'Store.storeName'"> <td><input class="toggle" type="checkbox" ng-model="item.Completed"></td> <td>{{item.Name}}</td> <td>{{item.Quantity}} Stk.</td> <td>{{item.Price || 0 | number:2}} €</td> <td>{{item.Quantity*item.Price|| 0 | number:2}} €</td> <td>{{item.Store.storeName}}</td> <td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td> </tr> 

在我的控制器中,我有这个删除function,它应该删除特定的数据:

 $scope.removeItem = function(index){ $scope.items.splice(index,1); } 

这在视图中sorting之前很好地工作。 如果缺less重要的东西,请立即告诉我。

谢谢!

相反,也可以在$index上进行中继 – 正如您已经注意到的那样 – 将指向已sorting/已过滤数组中的索引,您可以将项目本身传递给removeItem函数:

 <a><img src="img/delete.png" ng-click="removeItem(item)">{{$index}}</a> 

并修改removeItem函数以使用数组的indexOf方法来查找索引,如下所示:

 $scope.removeItem = function(item){ $scope.items.splice($scope.items.indexOf(item),1); } 

我有同样的问题和其他答案在这个话题是不适合我的情况。

我用自定义filter解决了我的问题:

 angular.module('utils', []).filter('index', function () { return function (array, index) { if (!index) index = 'index'; for (var i = 0; i < array.length; ++i) { array[i][index] = i; } return array; }; }); 

可以这样使用:

 <tr ng-repeat="item in items | index | orderBy:'Store.storeName'"> 

然后在HTML中,您可以使用item.index而不是$index

这种方法适用于对象的集合。

请注意,这个自定义filter应该是应用的所有filter列表中的第一个(orderBy等),并且会将附加属性index (该名称是可定制的)添加到集合的每个对象中。

我开始学习angular度和面临类似的麻烦,并根据@ pkozlowski-opensource的答案,我解决了它只是像

 <a> <img src="img/delete.png" ng-click="removeItem(items.indexOf(item))"> {{items.indexOf(item)}} </a> 

尝试这个:

 $scope.remove = function(subtask) { var idx = $scope.subtasks.indexOf(subtask), st = $scope.currentTask.subtasks[idx]; // remove from DB SubTask.remove({'subtaskId': subtask.id}); // remove from local array $scope.subtasks.splice(idx,1); } 

你可以在我的博客的这个条目中find详细的解释。

我只是留下了评论,但我没有“名声”。

英里的解决scheme正是我所需要的。 回答pkozlowski.opensource的问题:当你有嵌套的ngRepeat s,一个dynamic列表(例如你允许删除的地方)或两者(这是我的情况),使用$index不起作用,因为它将是错误的索引sorting和使用ngInitcaching该值后的后端数据不工作,因为它不会重新评估列表更改时。

请注意,mile的解决scheme允许通过<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">传递参数<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">定义附加的索引属性名称<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">

我调整了版本:

 .filter( 'repeatIndex', function repeatIndex() { // This filter must be called AFTER 'filter'ing // and BEFORE 'orderBy' to be useful. return( function( array, index_name ) { index_name = index_name || 'index'; array.forEach( function( each, i ) {each[ index_name ] = i;}); return( array ); }); }) 

如果有人需要使用$index ,则可以给sorting/过滤的数组命名:

 <tr ng-repeat="item in sortedItems = (items | orderBy:'Store.storeName') track by $index"> 

在这里看到我的答案。