Die Verwendung $index
funktioniert in einfachen Fällen einwandfrei, und die Antwort von @ charlietfl ist großartig. Aber manchmal,$index
ist das nicht genug.
Stellen Sie sich vor, Sie haben ein einzelnes Array, das Sie in zwei verschiedenen ng-Wiederholungen präsentieren. Eine dieser ng-Wiederholungen wird nach Objekten gefiltert, die eine wahrheitsgemäße Eigenschaft haben, und die andere wird nach einer fälschlichen Eigenschaft gefiltert. Es werden zwei verschiedene gefilterte Arrays vorgestellt, die von einem einzelnen Original-Array abgeleitet sind. (Oder, wenn es zur Visualisierung beiträgt: Vielleicht haben Sie eine einzelne Gruppe von Personen, und Sie möchten eine ng-Wiederholung für die Frauen in dieser Gruppe und eine andere für die Männer in derselben Gruppe .) Ihr Ziel: Löschen Sie zuverlässig aus dem Original-Array unter Verwendung von Informationen aus den Mitgliedern der gefilterten Arrays.
In jedem dieser gefilterten Arrays ist $ index nicht der Index des Elements im ursprünglichen Array. Dies ist der Index im gefilterten Unterarray . Sie können also den Index der Person im ursprünglichen people
Array nicht erkennen, sondern kennen den $ index nur aus dem women
oder dem men
Unterarray. Versuchen Sie, damit zu löschen, und Sie werden Elemente von überall verschwinden lassen, außer wo Sie wollten. Was ist zu tun?
Wenn Sie das Glück haben, dass ein Datenmodell eine eindeutige Kennung für jedes Objekt enthält, verwenden Sie diese anstelle von $ index, um das Objekt und splice
es aus dem Hauptarray zu finden. (Verwenden Sie mein Beispiel unten, aber mit dieser eindeutigen Kennung.) Aber wenn Sie nicht so viel Glück haben?
Angular erweitert tatsächlich jedes Element in einem ng-wiederholten Array (im Hauptarray) mit einer eindeutigen Eigenschaft namens $$hashKey
. Sie können das ursprüngliche Array nach einer Übereinstimmung $$hashKey
mit dem Element durchsuchen, das Sie löschen möchten, und es auf diese Weise entfernen.
Beachten Sie, dass dies $$hashKey
ein Implementierungsdetail ist, das nicht in der veröffentlichten API für ng-repeat enthalten ist. Sie können die Unterstützung für diese Eigenschaft jederzeit entfernen. Aber wahrscheinlich nicht. :-)
$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;
};
});
}
Rufen Sie auf mit:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
BEARBEITEN: Die Verwendung einer solchen Funktion, bei der $$hashKey
anstelle eines modellspezifischen Eigenschaftsnamens ein Schlüssel verwendet wird , hat auch den wesentlichen zusätzlichen Vorteil, dass diese Funktion für verschiedene Modelle und Kontexte wiederverwendbar ist. Geben Sie Ihre Array-Referenz und Ihre Artikelreferenz an, und es sollte einfach funktionieren.