Puede usar groupBy del módulo angular.filter .
para que puedas hacer algo como esto:
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>
RESULTADO:
Nombre del grupo: alpha
* player: Gene
Nombre del grupo: beta
* player: George
* player: Paula
Nombre del grupo: gamma
* player: Steve
* player: Scruath
ACTUALIZACIÓN: jsbin Recuerde los requisitos básicos para usar angular.filter
, tenga en cuenta específicamente que debe agregarlo a las dependencias de su módulo:
(1) Puede instalar el filtro angular usando 4 métodos diferentes:
- clonar y construir este repositorio
- a través de Bower: ejecutando $ bower instale un filtro angular desde su terminal
- a través de npm: ejecutando $ npm instala angular-filter desde tu terminal
- a través de cdnjs http://www.cdnjs.com/libraries/angular-filter
(2) Incluya angular-filter.js (o angular-filter.min.js) en su index.html, después de incluir Angular.
(3) Agregue 'angular.filter' a la lista de dependencias de su módulo principal.
angular.filter
módulo.key
como objeto. suerte de tu parteAdemás de las respuestas aceptadas anteriores, creé un filtro genérico 'groupBy' usando la biblioteca underscore.js.
JSFiddle (actualizado): http://jsfiddle.net/TD7t3/
El filtro
Tenga en cuenta la llamada 'memorizar'. Este método de subrayado almacena en caché el resultado de la función y evita que angular evalúe la expresión del filtro cada vez, evitando así que angular alcance el límite de iteraciones de resumen.
El html
Aplicamos nuestro filtro 'groupBy' en la variable de alcance teamPlayers, en la propiedad 'team'. Nuestro ng-repeat recibe una combinación de (clave, valores []) que podemos usar en nuestras siguientes iteraciones.
Actualización 11 de junio de 2014 Expandí el grupo por filtro para tener en cuenta el uso de expresiones como clave (por ejemplo, variables anidadas). El servicio de análisis angular es bastante útil para esto:
El filtro (con soporte de expresión)
El controlador (con objetos anidados)
El html (con expresión sortBy)
JSFiddle: http://jsfiddle.net/k7fgB/2/
fuente
Primero haga un bucle usando un filtro que devolverá solo equipos únicos, y luego un bucle anidado que devuelva todos los jugadores por equipo actual:
http://jsfiddle.net/plantface/L6cQN/
html:
guión:
fuente
Originalmente usé la respuesta de Plantface, pero no me gustó cómo se veía la sintaxis en mi opinión.
Lo modifiqué para usar $ q.defer para procesar posteriormente los datos y devolver una lista de equipos únicos, que luego se usa como filtro.
http://plnkr.co/edit/waWv1donzEMdsNMlMHBa?p=preview
Ver
Controlador
fuente
Ambas respuestas fueron buenas, así que las moví a una directiva para que sea reutilizable y no se tenga que definir una segunda variable de alcance.
Aquí está el violín si quieres verlo implementado
A continuación se muestra la directiva:
Entonces se puede usar de la siguiente manera:
fuente
Actualizar
Inicialmente escribí esta respuesta porque la versión anterior de la solución sugerida por Ariel M. cuando se combinaba con otras
$filter
s provocaba un " Infite $ diggest Loop Error " (infdig
) . Afortunadamente, este problema se ha resuelto en la última versión de angular.filter .Sugerí la siguiente implementación, que no tenía ese problema :
Sin embargo, esta implementación solo funcionará con versiones anteriores a Angular 1.3. (Actualizaré esta respuesta en breve proporcionando una solución que funcione con todas las versiones).
De hecho, escribí una publicación sobre los pasos que tomé para desarrollar esto
$filter
, los problemas que encontré y las cosas que aprendí de ellos .fuente
angular-filter
versión: 0.5.0, no hay más excepciones.groupBy
Se puede encadenar con cualquier filtro. Además, sus excelentes casos de prueba terminan con éxito: aquí hay un plunker Gracias.Además de la respuesta aceptada, puede usar esto si desea agrupar por varias columnas :
fuente
Si necesita eso en el código js. Puede usar el método inyectado de angula-filter lib. Me gusta esto.
https://github.com/a8m/angular-filter/wiki/Common-Questions#inject-filters
fuente