Możesz użyć modułu groupBy z modułu angular.filter .
więc możesz zrobić coś takiego:
JS:
$scope.players = [
{name: 'Gene', team: 'alpha'},
{name: 'George', team: 'beta'},
{name: 'Steve', team: 'gamma'},
{name: 'Paula', team: 'beta'},
{name: 'Scruath', team: 'gamma'}
];
HTML:
<ul ng-repeat="(key, value) in players | groupBy: 'team'">
Group name: {{ key }}
<li ng-repeat="player in value">
player: {{ player.name }}
</li>
</ul>
WYNIK:
Nazwa grupy:
gracz alfa *: Gene
Nazwa grupy:
gracz beta *: George
* gracz: Paula
Nazwa grupy:
gracz gamma *: Steve
* gracz: Scruath
AKTUALIZACJA: jsbin Zapamiętaj podstawowe wymagania do użycia angular.filter
, w szczególności pamiętaj, że musisz dodać je do zależności swojego modułu:
(1) Możesz zainstalować filtr kątowy używając 4 różnych metod:
- klonuj i buduj to repozytorium
- przez Bower: uruchamiając $ bower zainstaluj filtr kątowy z terminala
- przez npm: uruchamiając $ npm zainstaluj filtr kątowy z terminala
- przez cdnjs http://www.cdnjs.com/libraries/angular-filter
(2) Dołącz angular-filter.js (lub angular-filter.min.js) do pliku index.html, po dołączeniu samego Angulara.
(3) Dodaj „angular.filter” do listy zależności modułu głównego.
angular.filter
modułu.key
jako obiekt. szczęście z twojej stronyOprócz zaakceptowanych odpowiedzi powyżej utworzyłem ogólny filtr „groupBy” przy użyciu biblioteki underscore.js.
JSFiddle (zaktualizowany): http://jsfiddle.net/TD7t3/
Filtr
Zwróć uwagę na wezwanie „memoize”. Ta metoda podkreślenia zapisuje w pamięci podręcznej wynik funkcji i uniemożliwia angularowi ocenę wyrażenia filtru za każdym razem, uniemożliwiając w ten sposób osiągnięcie limitu iteracji skrótu przez angular.
Plik html
Stosujemy nasz filtr „groupBy” w zmiennej zakresu teamPlayers we właściwości „team”. Nasze powtórzenie ng otrzymuje kombinację (klucz, wartości []), której możemy użyć w naszych kolejnych iteracjach.
Aktualizacja 11 czerwca 2014 r. Rozszerzyłem grupę o filtr, aby uwzględnić użycie wyrażeń jako klucza (np. Zmienne zagnieżdżone). Przydaje się do tego usługa analizy kątowej:
Filtr (z obsługą wyrażeń)
Kontroler (z zagnieżdżonymi obiektami)
HTML (z wyrażeniem sortBy)
JSFiddle: http://jsfiddle.net/k7fgB/2/
źródło
Najpierw wykonaj pętlę, używając filtru, który zwróci tylko unikalne drużyny, a następnie zagnieżdżoną pętlę, która zwróci wszystkich graczy z bieżącej drużyny:
http://jsfiddle.net/plantface/L6cQN/
html:
scenariusz:
źródło
Pierwotnie użyłem odpowiedzi Plantface, ale nie podobało mi się, jak wyglądała składnia w moim widoku.
Przerobiłem go tak, aby używał $ q.defer do przetwarzania końcowego danych i zwracania listy unikalnych zespołów, która jest następnie używana jako filtr.
http://plnkr.co/edit/waWv1donzEMdsNMlMHBa?p=preview
Widok
Kontroler
źródło
Obie odpowiedzi były dobre, więc przeniosłem je do dyrektywy, aby można ją było ponownie wykorzystać i nie trzeba było definiować drugiej zmiennej zakresu.
Oto skrzypce, jeśli chcesz zobaczyć, jak zostały wdrożone
Poniżej znajduje się dyrektywa:
Następnie można go użyć w następujący sposób:
źródło
Aktualizacja
Początkowo napisałem tę odpowiedź, ponieważ stara wersja rozwiązania zaproponowana przez Ariela M. w połączeniu z innymi
$filter
s wywołała „ Infite $ diggest Loop Error ” (infdig
) . Na szczęście ten problem został rozwiązany w najnowszej wersji pliku angular.filter .Zaproponowałem następującą implementację, która nie miała tego problemu :
Jednak ta implementacja będzie działać tylko z wersjami starszymi od Angular 1.3. (Wkrótce zaktualizuję tę odpowiedź, zapewniając rozwiązanie, które działa ze wszystkimi wersjami).
Właściwie napisałem post o krokach, które podjąłem, aby to rozwinąć
$filter
, o problemach, które napotkałem i rzeczach, których się z tego nauczyłem .źródło
angular-filter
wersję - 0.5.0, nie ma więcej wyjątków.groupBy
można łączyć z dowolnym filtrem. również jesteś świetny, przypadki testowe zakończyły się pomyślnie - oto plunker Dzięki.Oprócz zaakceptowanej odpowiedzi możesz użyć tego, jeśli chcesz pogrupować według wielu kolumn :
źródło
Jeśli potrzebujesz tego w kodzie js. Możesz użyć iniekcyjnej metody angula-filter lib. Lubię to.
https://github.com/a8m/angular-filter/wiki/Common-Questions#inject-filters
źródło