使用$index在基本情况下工作得非常好,@charlietfl的答案很棒。但有时,$index是不够的。
Imagine you have a single array, which you're presenting in two different ng-repeat's. One of those ng-repeat's is filtered for objects that have a truthy property, and the other is filtered for a falsy property. Two different filtered arrays are being presented, which derive from a single original array. (Or, if it helps to visualize: perhaps you have a single array of people, and you want one ng-repeat for the women in that array, and another for the men in that same array.) Your goal: delete reliably from the original array, using information from the members of the filtered arrays.
在每个过滤后的数组中,$index不会是原始数组中该项的索引。它将是筛选子数组的下标。你无法在原始的people数组中知道person的索引,你只能从women或men子数组中知道$index。尝试使用它删除,你会有项目从任何地方消失,除了你想要的地方。怎么办呢?
如果您足够幸运,使用的数据模型包含每个对象的唯一标识符,那么使用该标识符而不是$index来查找对象并将其从主数组中拼接出来。(请使用下面的例子,但是使用唯一标识符。)但如果你没那么幸运呢?
Angular实际上用一个名为$$hashKey的唯一属性来扩充ng-repeat数组(主数组中的原始数组)中的每一项。您可以在原始数组中搜索与要删除的项的$$hashKey相匹配的项,并以这种方式删除它。
注意$$hashKey是一个实现细节,不包含在ng-repeat的已发布API中。他们可以在任何时候删除对该属性的支持。但可能不会。: -)
$scope.deleteFilteredItem = function(hashKey, sourceArray){
angular.forEach(sourceArray, function(obj, index){
// sourceArray is a reference to the original array passed to ng-repeat,
// rather than the filtered version.
// 1. compare the target object's hashKey to the current member of the iterable:
if (obj.$$hashKey === hashKey) {
// remove the matching item from the array
sourceArray.splice(index, 1);
// and exit the loop right away
return;
};
});
}
调用:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
EDIT:使用这样的函数(键在$$hashKey上,而不是特定于模型的属性名上)还有一个显著的附加优势,即使该函数可以跨不同的模型和上下文重用。向它提供数组引用和项引用,它就可以工作了。