Você pode usar o groupBy do módulo angular.filter .
para que você possa fazer algo assim:
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:
Nome do grupo: alpha
* jogador: Gene
Nome do grupo: beta
* jogador: George
* jogador: Paula
Nome do grupo: gama
* jogador: Steve
* jogador: Scruath
UPDATE: jsbin Lembre-se dos requisitos básicos a serem usados angular.filter
, observe especificamente que você deve adicioná-lo às dependências do seu módulo:
(1) Você pode instalar o filtro angular usando 4 métodos diferentes:
- clonar e construir este repositório
- via Bower: executando $ bower, instale um filtro angular a partir do seu terminal
- via npm: executando $ npm instale o filtro angular do seu terminal
- via cdnjs http://www.cdnjs.com/libraries/angular-filter
(2) Inclua angular-filter.js (ou angular-filter.min.js) em seu index.html, depois de incluir o próprio Angular.
(3) Adicione 'angular.filter' à lista de dependências do seu módulo principal.
angular.filter
módulo.key
como objeto. alguma sorte do seu ladoAlém das respostas aceitas acima, criei um filtro 'groupBy' genérico usando a biblioteca underscore.js.
JsFiddle (atualizado): http://jsfiddle.net/TD7t3/
O filtro
Observe a chamada 'memorizar'. Esse método de sublinhado armazena em cache o resultado da função e impede que angular avalie a expressão do filtro todas as vezes, impedindo que angular atinja o limite de iterações de compilação.
O html
Aplicamos nosso filtro 'groupBy' na variável de escopo teamPlayers, na propriedade 'team'. Nosso ng-repeat recebe uma combinação de (key, values []) que podemos usar nas próximas iterações.
Atualização em 11 de junho de 2014 Expandi o grupo por filtro para considerar o uso de expressões como a chave (por exemplo, variáveis aninhadas). O serviço de análise angular é bastante útil para isso:
O filtro (com suporte à expressão)
O controlador (com objetos aninhados)
O html (com expressão sortBy)
JSFiddle: http://jsfiddle.net/k7fgB/2/
fonte
Primeiro, faça um loop usando um filtro que retornará apenas equipes únicas e, em seguida, um loop aninhado que retorna todos os jogadores por time atual:
http://jsfiddle.net/plantface/L6cQN/
html:
roteiro:
fonte
Originalmente, usei a resposta do Plantface, mas não gostei da aparência da sintaxe.
Reescrevi -o para usar $ q.defer para pós-processar os dados e retornar uma lista em equipes únicas, que são usadas como filtro.
http://plnkr.co/edit/waWv1donzEMdsNMlMHBa?p=preview
Visão
Controlador
fonte
Ambas as respostas foram boas, então eu as mudei para uma diretiva para que seja reutilizável e uma segunda variável de escopo não precise ser definida.
Aqui está o violino, se você quiser vê-lo implementado
Abaixo está a diretiva:
Em seguida, pode ser usado da seguinte maneira:
fonte
Atualizar
Inicialmente, escrevi essa resposta porque a versão antiga da solução sugerida por Ariel M. quando combinada com outras
$filter
s acionou um " Infite $ diggest Loop Error " (infdig
) . Felizmente, esse problema foi resolvido na versão mais recente do angular.filter .Sugeri a seguinte implementação, que não tinha esse problema :
No entanto, essa implementação funcionará apenas com versões anteriores ao Angular 1.3. (Atualizarei esta resposta em breve, fornecendo uma solução que funcione com todas as versões.)
Na verdade, escrevi um post sobre as etapas que eu tomei para desenvolver isso
$filter
, os problemas que encontrei e as coisas que aprendi com isso .fonte
angular-filter
versão - 0.5.0, não há mais exceção.groupBy
pode ser corrente com qualquer filtro. Além disso, seus ótimos casos de teste são concluídos com êxito - aqui está uma vantagem Agradecemos.Além da resposta aceita, você pode usar isso se desejar agrupar por várias colunas :
fonte
Se você precisar disso no código js. Você pode usar o método injetado da lib de filtro angular. Como isso.
https://github.com/a8m/angular-filter/wiki/Common-Questions#inject-filters
fonte