Wie kann ich ein umgekehrtes Array im Winkel erhalten? Ich versuche, den orderBy-Filter zu verwenden, aber zum Sortieren wird ein Prädikat (z. B. 'name') benötigt:
<tr ng-repeat="friend in friends | orderBy:'name':true">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
<tr>
Gibt es eine Möglichkeit, das ursprüngliche Array umzukehren, ohne es zu sortieren? so wie das:
<tr ng-repeat="friend in friends | orderBy:'':true">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
<tr>
ng-repeat
Verhalten zu ändern ! @ Trevor Senior hat gute Arbeit geleistet.Antworten:
Ich würde vorschlagen, einen benutzerdefinierten Filter wie diesen zu verwenden:
Welches kann dann verwendet werden wie:
Sehen Sie, wie es hier funktioniert: Plunker-Demonstration
Dieser Filter kann nach Ihren Wünschen angepasst werden. Ich habe andere Beispiele in der Demonstration geliefert. Einige Optionen umfassen das Überprüfen, ob die Variable ein Array ist, bevor die Umkehrung durchgeführt wird, oder das mildere Umkehren, um das Umkehren von mehr Dingen wie Zeichenfolgen zu ermöglichen.
quelle
items.reverse()
das Array geändert wird, anstatt nur ein neues zu erstellen und es zurückzugeben.slice()
, um dieses Problem zu lösen.if (!angular.isArray(items)) return false;
, um zu überprüfen, ob Sie ein Array haben, bevor Sie versuchen, es umzukehren.Das habe ich benutzt:
Aktualisieren:
Meine Antwort war OK für die alte Version von Angular. Jetzt sollten Sie verwenden
ng-repeat="friend in friends | orderBy:'-'"
oder
von https://stackoverflow.com/a/26635708/1782470
quelle
track by
, dies ist der einzige Weg, der für mich funktioniert hatng-repeat="friend in friends | orderBy:'+': true track by $index"
Es tut uns leid, dass Sie dies nach einem Jahr angesprochen haben , aber es gibt eine neue, einfachere Lösung , die für Angular v1.3.0-rc.5 und höher funktioniert .
In den Dokumenten wird erwähnt : "Wenn keine Eigenschaft angegeben ist (z. B. '+'), wird das Array-Element selbst verwendet, um zu vergleichen, wo sortiert wird." Die Lösung lautet also:
ng-repeat="friend in friends | orderBy:'-'"
oderng-repeat="friend in friends | orderBy:'+':true"
Diese Lösung scheint besser zu sein, da sie kein Array ändert und keine zusätzlichen Rechenressourcen erfordert (zumindest in unserem Code). Ich habe alle vorhandenen Antworten gelesen und bevorzuge diese immer noch.
quelle
v1.3.0-rc.4
) nicht funktionieren . Wenn jemand die Möglichkeit hat, es in der neuen Version zu versuchen, lassen Sie es uns wissen!v1.3.0-rc.5
( rc.5 docs vs rc.4 docs ) funktionieren . Ich habe die Antwort aktualisiertorderBy:'+':true
,orderBy:'-':true
,orderBy:'-':false
,orderBy:'+':false
:(Sie können mit dem Parameter $ index umkehren
quelle
$index
). Ich bin auf Angular 1.1.5.ng-repeat="friend in friends | orderBy:'id':true"
funktioniert.Einfache Lösung: - (keine Methoden erforderlich)
quelle
Sie können einfach eine Methode in Ihrem Bereich aufrufen, um sie für Sie umzukehren:
Beachten Sie, dass das
$scope.reverse
eine Kopie des Arrays erstellt, daArray.prototype.reverse
das ursprüngliche Array geändert wird.quelle
Wenn Sie 1.3.x verwenden, können Sie Folgendes verwenden
Beispiel Listet Bücher nach Veröffentlichungsdatum in absteigender Reihenfolge auf
Quelle: https://docs.angularjs.org/api/ng/filter/orderBy
quelle
Wenn Sie anglejs Version 1.4.4 und höher verwenden , können Sie den " $ index " auf einfache Weise sortieren .
Demo ansehen
quelle
Wenn Sie MVC in .NET mit Angular verwenden, können Sie OrderByDecending () immer verwenden, wenn Sie Ihre Datenbankabfrage wie folgt ausführen:
Auf der Winkelseite wird es dann in einigen Browsern (IE) bereits umgekehrt. Wenn Sie Chrome und FF unterstützen, müssen Sie orderBy hinzufügen:
In diesem Beispiel würden Sie in absteigender Reihenfolge nach der .Id-Eigenschaft sortieren. Wenn Sie Paging verwenden, wird dies komplizierter, da nur die erste Seite sortiert wird. Sie müssten dies über eine .js-Filterdatei für Ihren Controller oder auf andere Weise erledigen.
quelle
Sie können auch .reverse () verwenden. Es ist eine native Array-Funktion
<div ng-repeat="friend in friends.reverse()">{{friend.name}}</div>
quelle
reverse
möchten : Das Array wird umgekehrt, es wird nicht nur eine umgekehrte Kopie zurückgegeben. Dies bedeutet, dass jedes Mal, wenn dies ausgewertet wird, das Array umgekehrt wird.Dies liegt daran, dass Sie JSON Object verwenden. Wenn Sie auf solche Probleme stoßen, ändern Sie Ihr JSON-Objekt in JSON-Array-Objekt.
Beispielsweise,
quelle
Der
orderBy
Filter führt ab Winkel 1.4.5 eine stabile Sortierung durch. (Siehe die GitHub-Pull-Anfrage https://github.com/angular/angular.js/pull/12408 .)Es reicht also aus, ein konstantes Prädikat zu verwenden und
reverse
Folgendes festzulegentrue
:quelle
Ich habe so etwas gefunden, aber anstelle von Array verwende ich Objekte.
Hier ist meine Lösung für Objekte:
Benutzerdefinierten Filter hinzufügen:
Welches kann dann wie verwendet werden
Wenn Sie Unterstützung für alte Browser benötigen, müssen Sie die Reduzierungsfunktion definieren (diese ist nur in ECMA-262 mozilla.org verfügbar ).
quelle
Ich war selbst frustriert über dieses Problem und habe den von @Trevor Senior erstellten Filter geändert, als ich auf ein Problem mit meiner Konsole stieß, das besagte, dass die umgekehrte Methode nicht verwendet werden konnte. Ich wollte auch die Integrität des Objekts beibehalten, da Angular dies ursprünglich in einer ng-repeat-Direktive verwendet. In diesem Fall habe ich die Eingabe von dumm (Schlüssel) verwendet, da sich die Konsole darüber aufregt, dass es Duplikate gibt, und in meinem Fall musste ich nach $ index verfolgen.
Filter:
HTML:
<div ng-repeat="items in items track by $index | reverse: items">
quelle
Ich füge eine Antwort hinzu, die niemand erwähnt hat. Ich würde versuchen, den Server dazu zu bringen, wenn Sie einen haben. Die clientseitige Filterung kann gefährlich sein, wenn der Server viele Datensätze zurückgibt. Weil Sie möglicherweise gezwungen sind, Paging hinzuzufügen. Wenn Sie Paging vom Server haben, befindet sich der bestellte Clientfilter auf der aktuellen Seite. Das würde den Endbenutzer verwirren. Wenn Sie also einen Server haben, senden Sie den Auftrag mit dem Anruf und lassen Sie ihn vom Server zurückgeben.
quelle
Nützlicher Tipp:
Sie können Ihr Array mit Vanilla Js umkehren: yourarray .reverse ()
Achtung: Die Umkehrung ist destruktiv, daher ändert sich Ihr Array, nicht nur die Variable.
quelle
Ich würde vorschlagen, dass die Verwendung der nativen Array-Umkehrmethode immer die bessere Wahl ist, als Filter zu erstellen oder zu verwenden
$index
.Plnkr_demo .
quelle