Ich bin neu in Angular.js und habe einige Probleme beim Sortieren meines Arrays und beim Bearbeiten dieser sortierten Daten.
Ich habe eine Liste mit Elementen und möchte sie nach "Store.storeName" sortieren, was bisher funktioniert. Aber nach dem Sortieren der Daten funktioniert meine Löschfunktion nicht mehr. Ich denke, das liegt daran, dass der $ -Index nach dem Sortieren falsch ist und daher die falschen Daten gelöscht werden.
Wie kann ich das lösen? Bestellen Sie die Daten im Bereich und nicht in der Ansicht? Wie geht das?
Hier ist ein relevanter Code:
In der Ansicht:
<tr ng-repeat="item in items | orderBy:'Store.storeName'">
<td><input class="toggle" type="checkbox" ng-model="item.Completed"></td>
<td>{{item.Name}}</td>
<td>{{item.Quantity}} Stk.</td>
<td>{{item.Price || 0 | number:2}} €</td>
<td>{{item.Quantity*item.Price|| 0 | number:2}} €</td>
<td>{{item.Store.storeName}}</td>
<td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td>
</tr>
Und in meinem Controller habe ich diese Löschfunktion, die die spezifischen Daten löschen soll:
$scope.removeItem = function(index){
$scope.items.splice(index,1);
}
Dies funktioniert gut, bevor Sie in der Ansicht bestellen. Wenn etwas Wichtiges fehlt, lassen Sie es mich jetzt.
Vielen Dank!
quelle
Ich fing an, eckig zu lernen und hatte ähnliche Probleme. Basierend auf der Antwort von @ pkozlowski-opensource löste ich es einfach mit so etwas wie
quelle
Ich hatte das gleiche Problem und andere Antworten in diesem Thema sind nicht für meine Situation geeignet.
Ich habe mein Problem mit dem benutzerdefinierten Filter gelöst:
die so verwendet werden kann:
und dann in HTML können Sie
item.index
anstelle von verwenden$index
.Diese Methode eignet sich für die Sammlung von Objekten.
Beachten Sie bitte, dass dieser benutzerdefinierte Filter der erste in der Liste aller angewendeten Filter sein sollte (orderBy usw.) und die zusätzliche Eigenschaft
index
(der Name ist anpassbar) zu jedem Objekt der Sammlung hinzufügt .quelle
$scope.items.splice($scope.items.indexOf(item),1);
nicht wie erwartet für doppelte Elemente.(key, item) in items
und es funktioniert auch nicht. (Schlüssel wird nicht auf Original gehalten)Versuche dies:
Eine ausführliche Erklärung finden Sie in diesem Eintrag in meinem Blog.
quelle
Falls jemand etwas verwenden muss
$index
, können Sie dem sortierten / gefilterten Array einen Namen geben:Siehe meine Antwort hier .
quelle
Ich hätte nur einen Kommentar hinterlassen, aber ich habe nicht den "Ruf".
Die Lösung von Mile ist genau das, was ich auch brauchte. Um die Frage von pkozlowski.opensource zu beantworten: Wenn Sie entweder
ngRepeat
s verschachtelt haben , eine dynamische Liste (z. B. wo Sie Entfernungen zulassen) oder beides (was mein Fall ist),$index
funktioniert die Verwendung nicht, da dies der falsche Index für das Back-End ist Daten nach dem Sortieren und VerwendenngInit
zum Zwischenspeichern des Werts funktionieren ebenfalls nicht, da sie nicht neu ausgewertet werden, wenn sich die Liste ändert.Beachten Sie, dass mit der Mile-Lösung der Name der angehängten Indexeigenschaft durch Übergabe eines Parameters angepasst werden kann
<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">
Meine optimierte Version:
quelle