Używanie $index
działa doskonale w podstawowych przypadkach, a odpowiedź @ charlietfl jest świetna. Ale czasami $index
to nie wystarczy.
Wyobraź sobie, że masz jedną tablicę, którą prezentujesz w dwóch różnych powtórzeniach ng. Jeden z powtórzeń ng jest filtrowany pod kątem obiektów, które mają prawdziwą właściwość, a drugi jest filtrowany pod kątem właściwości fałsz. Prezentowane są dwie różne tablice filtrowane, które pochodzą z pojedynczej oryginalnej tablicy. (Lub, jeśli to pomaga w wizualizacji: być może masz jedną grupę ludzi i chcesz jedno powtórzenie ng dla kobiet w tej tablicy, a drugie dla mężczyzn w tej samej tablicy .) Twój cel: niezawodne usunięcie z oryginalna tablica, wykorzystująca informacje od członków filtrowanych tablic.
W każdej z tych filtrowanych tablic $ index nie będzie indeksem elementu w oryginalnej tablicy. Będzie to indeks w filtrowanej pod-macierzy . Tak więc, nie będzie w stanie powiedzieć, indeks osoby w oryginalnej people
tablicy, będziesz wiedzieć tylko indeks $ z women
lub men
sub-macierzy. Spróbuj usunąć za pomocą tego, a będziesz znikał z każdego miejsca, z wyjątkiem miejsca, w którym chciałeś. Co robić?
Jeśli masz szczęście, że używasz modelu danych zawierającego unikalny identyfikator dla każdego obiektu, użyj go zamiast $ index, aby znaleźć obiekt i splice
go z głównej tablicy. (Użyj mojego przykładu poniżej, ale z tym unikalnym identyfikatorem.) Ale jeśli nie masz tyle szczęścia?
Angular w rzeczywistości zwiększa każdy element w tablicy z powtórzeniami ng (w głównej, oryginalnej tablicy) o unikalną właściwość o nazwie $$hashKey
. Możesz przeszukać oryginalną tablicę pod kątem dopasowania $$hashKey
elementu, który chcesz usunąć, i w ten sposób się go pozbyć.
Należy pamiętać, że $$hashKey
jest to szczegół implementacji, nieuwzględniony w opublikowanym interfejsie API dla ng-repeat. Mogą w dowolnym momencie usunąć obsługę tej właściwości. Ale prawdopodobnie nie. :-)
$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;
};
});
}
Wywołaj z:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
EDYCJA: Użycie takiej funkcji, która wprowadza $$hashKey
zamiast nazwy właściwości specyficznej dla modelu, ma również znaczącą dodatkową zaletę polegającą na tym, że można użyć tej funkcji w różnych modelach i kontekstach. Podaj je z odniesieniem do tablicy i odniesieniem do przedmiotu, a powinno po prostu działać.