El uso $index
funciona perfectamente bien en casos básicos, y la respuesta de @ charlietfl es excelente. Pero a veces, $index
no 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 people
matriz original , solo sabrá el $ index de la women
o men
sub-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 splice
sacarlo 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 $$hashKey
del elemento que desea eliminar y deshacerse de ella de esa manera.
Tenga en cuenta que $$hashKey
es 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 $$hashKey
lugar 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.