Ich habe ein Objekt wie dieses:
%Vor% Ich zeige dies mit ngRepeat an. Ich kann nicht nach dateReleased
sortieren. Umgekehrt funktioniert auch die Bestellung nicht. Mein ngRepeat sieht folgendermaßen aus:
Wenn Sie in der Dokumentation nachschauen, kann der Ausdruck in orderBy eine -Funktion sein , eine string oder ein Array . Daher benötigen Sie dateReleased als Zeichenfolge: 'dateReleased'
Sie müssen auch Ihre Telefone Objekt ein Array sein.
Versuchen Sie:
%Vor% Während ngRepeat in Ihrem Beispiel ein Hash-Objekt wie $scope.phones
iterieren kann, funktioniert der integrierte orderBy
-Filter nicht. Ich glaube, das liegt an der Art und Weise, wie Objekte gespeichert werden. Wie andere bemerkt haben, müssen Sie den Hash in ein Array konvertieren. Während Sie dies mit den oben vorgeschlagenen Methoden tun können, verwende ich lieber einen benutzerdefinierten Filter. Dies gibt mir den Vorteil, dass ich meinen Hash nicht direkt ändern muss und den Filter mit anderen Hashes wiederverwenden kann.
Dieser Filter konvertiert das Objekt in ein Standard-Array und sortiert es nach dem von Ihnen angegebenen Feld. Sie können den orderObjectBy
-Filter genauso verwenden wie orderBy
, einschließlich eines booleschen Werts hinter dem Feldnamen, um anzugeben, ob die Reihenfolge umgekehrt werden soll. Mit anderen Worten, false
ist aufsteigend, true
ist absteigend.
Ich habe einen Beitrag in meinem Blog zu diesem Thema.
Die beiden anderen Antworten bringen dich dahin, aber nicht den ganzen Weg ...
Sie müssen eine Funktion in Ihrem Bereich erstellen, die das Objekt in ein Array wie folgt konvertiert:
%Vor%Dann würden Sie das anstelle Ihres Objekts in Ihrem ngRepeat nennen:
%Vor% Außerdem: Beachten Sie, dass 'dateReleased'
eine Zeichenkette ist, also weiß es, dass $ eval diese Zeichenkette vom aktuellen Element entfernt, andernfalls wird es das übergeordnete $ scope.dateReleased überprüfen, das nicht existiert.
Hier ist ein Plunk für was ich denke, dass du versuchst zu tun
BEARBEITEN: Sie können das Objekt auch in ein Array "konvertieren" und es auf dem $ scope speichern, wenn Sie sich Sorgen machen, dass die Funktion zu "teuer" ist, aber das sollte kein Problem sein, weil Sie eine Client-App für einen Benutzer und keine Server-Anwendung für viele Benutzer entwickeln, was bedeutet, dass Sie ein wenig Spielraum für "teuer" haben. (Was es nicht sowieso sein wird)
Zuerst müssen Sie verstehen, dass ng:filter
und ng:orderBy
mit Arrays (einer geordneten Sammlung von Elementen) arbeiten, aber Sie versuchen, sie für Objekte (_un_ordered Sammlung von Elementen) zu verwenden. Ein möglicher Ansatz besteht darin, alle Objekte in einem Array zu sammeln und dann stattdessen mit ng-repeat
fortzufahren. So: