Vous pouvez utiliser groupBy du module angular.filter .
afin que vous puissiez faire quelque chose comme ceci:
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>
RÉSULTAT:
Nom du groupe: alpha
* joueur: Gene
Nom du groupe: beta
* joueur: George
* joueur: Paula
Nom du groupe: gamma
* joueur: Steve
* joueur: Scruath
UPDATE: jsbin Rappelez-vous les exigences de base à utiliser angular.filter
, notez en particulier que vous devez l'ajouter aux dépendances de votre module:
(1) Vous pouvez installer un filtre angulaire en utilisant 4 méthodes différentes:
- cloner et construire ce référentiel
- via Bower: en exécutant $ bower install angular-filter depuis votre terminal
- via npm: en exécutant $ npm, installez angular-filter depuis votre terminal
- via cdnjs http://www.cdnjs.com/libraries/angular-filter
(2) Incluez angular-filter.js (ou angular-filter.min.js) dans votre index.html, après avoir inclus Angular lui-même.
(3) Ajoutez 'angular.filter' à la liste des dépendances de votre module principal.
angular.filter
module.key
comme objet. aucune chance de votre partEn plus des réponses acceptées ci-dessus, j'ai créé un filtre générique 'groupBy' en utilisant la bibliothèque underscore.js.
JSFiddle (mis à jour): http://jsfiddle.net/TD7t3/
Le filtre
Notez l'appel «mémoize». Cette méthode de soulignement met en cache le résultat de la fonction et empêche angular d'évaluer l'expression du filtre à chaque fois, empêchant ainsi angular d'atteindre la limite d'itérations de résumé.
Le html
Nous appliquons notre filtre 'groupBy' sur la variable de portée teamPlayers, sur la propriété 'team'. Notre ng-repeat reçoit une combinaison de (clé, valeurs []) que nous pouvons utiliser dans nos itérations suivantes.
Mise à jour du 11 juin 2014 J'ai élargi le groupe par filtre pour tenir compte de l'utilisation d'expressions comme clé (par exemple des variables imbriquées). Le service d'analyse angulaire est très pratique pour cela:
Le filtre (avec support d'expression)
Le contrôleur (avec des objets imbriqués)
Le html (avec l'expression sortBy)
JSFiddle: http://jsfiddle.net/k7fgB/2/
la source
Faites d'abord une boucle en utilisant un filtre qui ne retournera que des équipes uniques, puis une boucle imbriquée qui renvoie tous les joueurs par équipe actuelle:
http://jsfiddle.net/plantface/L6cQN/
html:
scénario:
la source
J'ai utilisé à l'origine la réponse de Plantface, mais je n'aimais pas à quoi ressemblait la syntaxe à mon avis.
Je l'ai retravaillé pour utiliser $ q.defer pour post-traiter les données et renvoyer une liste d'équipes uniques, qui est ensuite utilisée comme filtre.
http://plnkr.co/edit/waWv1donzEMdsNMlMHBa?p=preview
Vue
Manette
la source
Les deux réponses étaient bonnes, je les ai donc déplacées dans une directive afin qu'elle soit réutilisable et qu'une deuxième variable de portée ne doive pas être définie.
Voici le violon si vous voulez le voir implémenté
Voici la directive:
Ensuite, il peut être utilisé comme suit:
la source
Mettre à jour
J'ai d'abord écrit cette réponse parce que l'ancienne version de la solution suggérée par Ariel M. lorsqu'elle était combinée avec d'autres
$filter
s déclenchait une " Infite $ diggest Loop Error " (infdig
) . Heureusement, ce problème a été résolu dans la dernière version de angular.filter .J'ai suggéré l'implémentation suivante, qui n'avait pas ce problème :
Cependant, cette implémentation ne fonctionnera qu'avec les versions antérieures à Angular 1.3. (Je mettrai à jour cette réponse sous peu en fournissant une solution qui fonctionne avec toutes les versions.)
J'ai en fait écrit un article sur les étapes que j'ai suivies pour développer cela
$filter
, les problèmes que j'ai rencontrés et les choses que j'en ai tirées .la source
angular-filter
version - 0.5.0, il n'y a plus d'exception.groupBy
peut être en chaîne avec n'importe quel filtre. De plus, vos cas de test sont excellents et terminez avec succès - voici un plunker Merci.En plus de la réponse acceptée, vous pouvez l'utiliser si vous souhaitez regrouper par plusieurs colonnes :
la source
Si vous en avez besoin dans le code js. Vous pouvez utiliser la méthode injectée de angula-filter lib. Comme ça.
https://github.com/a8m/angular-filter/wiki/Common-Questions#inject-filters
la source