El uso $indexfunciona perfectamente bien en casos básicos, y la respuesta de @ charlietfl es excelente. Pero a veces, $indexno es suficiente.
Imagine que tiene una sola matriz, que está presentando en dos ng-repeat's diferentes. Uno de esos ng-repeat es filtrado por objetos que tienen una propiedad de verdad, y el otro es filtrado por una propiedad de falsedad. Se presentan dos matrices filtradas diferentes, que se derivan de una matriz original única. (O, si ayuda a visualizar: tal vez tiene una sola matriz de personas, y desea una repetición de ng para las mujeres en esa matriz, y otra para los hombres en esa misma matriz ). Su objetivo: eliminar de manera confiable matriz original, utilizando información de los miembros de las matrices filtradas.
En cada una de esas matrices filtradas, $ index no será el índice del elemento dentro de la matriz original. Será el índice en la submatriz filtrada . Por lo tanto, no podrá distinguir el índice de la persona en la peoplematriz original , solo sabrá el $ index de la womeno mensub-matriz. Intenta eliminar usando eso, y tendrás elementos que desaparecerán de todas partes excepto donde quisieras. ¿Qué hacer?
Si tienes la suerte de estar usando un modelo de datos que incluye un identificador único para cada objeto, entonces úsalo en lugar de $ index para encontrar el objeto y splicesacarlo de la matriz principal. (Use mi ejemplo a continuación, pero con ese identificador único). ¿Pero si no tiene tanta suerte?
Angular en realidad aumenta cada elemento en una matriz ng repetida (en la matriz principal original) con una propiedad única llamada $$hashKey. Puede buscar una coincidencia en la matriz original $$hashKeydel elemento que desea eliminar y deshacerse de ella de esa manera.
Tenga en cuenta que $$hashKeyes un detalle de implementación, no incluido en la API publicada para ng-repeat. Podrían eliminar el soporte de esa propiedad en cualquier momento. Pero probablemente no. :-)
$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;
};
});
}
Invocar con:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
EDITAR: el uso de una función como esta, que utiliza teclas en $$hashKeylugar de un nombre de propiedad específico del modelo, también tiene la ventaja adicional significativa de hacer que esta función sea reutilizable en diferentes modelos y contextos. Proporcione su referencia de matriz y su referencia de elemento, y debería funcionar.