L'uso $index
funziona perfettamente nei casi di base e la risposta di @ charlietfl è ottima. Ma a volte $index
non è abbastanza.
Immagina di avere un solo array, che stai presentando in due diverse repliche. Uno di questi ng-repeat è filtrato per oggetti che hanno una proprietà true, e l'altro è filtrato per una proprietà falsy. Vengono presentati due diversi array filtrati, che derivano da un singolo array originale. (Oppure, se aiuta a visualizzare: forse hai un solo array di persone e vuoi una ng-repeat per le donne in quell'array e un'altra per gli uomini in quello stesso array .) Il tuo obiettivo: eliminare in modo affidabile dal array originale, utilizzando le informazioni dai membri degli array filtrati.
In ognuna di quelle matrici filtrate, $ index non sarà l'indice dell'elemento all'interno dell'array originale. Sarà l'indice nell'array secondario filtrato . Quindi, non sarà in grado di dire indice della persona in originale people
matrice, saprete solo l'indice $ dal women
o men
sub-array. Prova a eliminarlo usando quello e avrai oggetti che spariscono da ogni parte tranne dove volevi. Cosa fare?
Se sei abbastanza fortunato, l'utilizzo di un modello di dati include un identificatore univoco per ciascun oggetto, quindi utilizza quello invece di $ index per trovare l'oggetto e splice
l'array fuori dall'array principale. (Usa il mio esempio qui sotto, ma con quell'identificatore univoco.) Ma se non sei così fortunato?
Angular aumenta effettivamente ogni elemento in una matrice ripetuta ng (nella matrice principale originale) con una proprietà unica chiamata $$hashKey
. Puoi cercare nell'array originale una corrispondenza $$hashKey
dell'elemento che desideri eliminare e liberartene in quel modo.
Si noti che $$hashKey
è un dettaglio dell'implementazione, non incluso nell'API pubblicata per ng-repeat. Potrebbero rimuovere il supporto per quella proprietà in qualsiasi momento. Ma probabilmente 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;
};
});
}
Invocare con:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
MODIFICA: L'uso di una funzione come questa, che consente di utilizzare il tasto $$hashKey
anziché il nome di una proprietà specifica del modello, ha anche il significativo vantaggio aggiuntivo di rendere questa funzione riutilizzabile in diversi modelli e contesti. Forniscilo con il riferimento dell'array e il riferimento dell'articolo e dovrebbe funzionare.