Wenn Sie eine Liste mit Elementen mit Datumsfeld haben, die nach Datum sortiert ist. Ich möchte diese Elemente nach Datum gruppieren wie:
und so weiter ...
Was ich habe ist das;
%Vor%Aber so wird h1 Element zum Kind des li-Elements, das die Präsentation durcheinanderbringt. Gibt es eine andere Möglichkeit, diese ng-Wiederholung so zu schreiben, wie ich es möchte?
Ich habe eine Lösung, die möglicherweise nicht funktioniert, abhängig von der Anzahl der Elemente in Ihrer Liste.
Meine Idee war, einen Filter anzuwenden, um eine einfache Liste in eine hierarchische umzuwandeln.
Hier ist ein arbeitender jsFiddle . (Siehe den neuen unten, wirklich!)
Die Idee ist einfach, nimm eine bestehende Liste und ordne sie im Handumdrehen um:
%Vor% In diesem Fall haben wir das ursprüngliche Array verwendet und einen Filter groupBy
darauf angewendet. Dieser Filter ist eigentlich eine Art Komplex, weil er sicherstellen muss, dass er das Array nicht mehr als nötig modifiziert, also muss er eine tiefe Kopie des ursprünglichen Arrays speichern, mit der verglichen werden soll. Wenn Sie diese Tiefenkopie und Inspektion entfernen, erhalten Sie jedes Mal $digest
Iterationsfehler.
Bearbeiten: Siehe unten für eine modifizierte Version, die flachere Kopien des Arrays ausführt
Hier ist der Filtercode:
%Vor% ( mArr
, mGroupBy
und mRetArr
sind hier die "memoisierten" Werte.)
Der Vorteil dieses Filters ist, dass nicht erfordert , dass die Daten bereits gruppiert eingehen. Die jsFiddle, die oben verlinkt ist, enthält eine Schaltfläche zum dynamischen Hinzufügen von Elementen zum Array am Ende, aber sie werden immer noch in Gruppen sortiert.
Auch hier ist der wirkliche Nachteil, dass es aufgrund der Anzahl der Einträge in Ihrer Liste langsam und / oder teuer sein könnte. Hunderte von moderat komplexen Objekten sollten in Ordnung sein, aber wenn Sie Tausende haben, sollten Sie sie vorher anderswo sortieren, bevor sie den Bereich erreichen.
Auf Kosten von mehr Code-Komplexität habe ich den Filter modifiziert, um nur die Schlüsselinformationen zu kopieren, anstatt das gesamte Array tief zu kopieren. Diesmal mache ich eine Hashmap der Gruppen mit den Items. Die Elemente werden weiterhin referenziert, aber dieses Mal handelt es sich um eine explizite Referenz. Wenn also ein Element in der Struktur geändert wird, wird kein Resort erzwungen, aber die Gruppe eines Elements geändert oder ein Element hinzugefügt oder entfernt.
Neue Geige: Ссылка
Und hier ist der neue Filter:
%Vor%Es ist viel komplizierter, aber dieses sollte eine bedeutend bessere Leistung gegenüber großen Mengen haben, da es das absolute Minimum an Duplizierung des ursprünglichen Arrays gibt.
Tags und Links angularjs angularjs-ng-repeat