Eu tenho uma matriz de dados que contém muitos objetos (formato JSON). O seguinte pode ser assumido como o conteúdo dessa matriz:
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
Agora, eu mostro esses detalhes como:
<div ng-repeat="person in data | filter: query">
</div
Aqui, a consulta é modelada para um campo de entrada no qual o usuário pode restringir os dados exibidos.
Agora, tenho outro local no qual mostro a contagem atual de pessoas / pessoa sendo exibida, ou seja, Showing {{data.length}} Persons
O que eu quero fazer é que, quando o usuário procurar uma pessoa e os dados exibidos forem filtrados com base na consulta, eles Showing...persons
também alterem o valor das pessoas exibidas no momento. Mas isso não está acontecendo. Ele sempre exibe o total de pessoas nos dados e não no filtrado - como obtenho a contagem de dados filtrados?
fonte
$scope.filtered.length
.undefined
, provavelmente porque no momento do logon, a variável ainda não está definida. Então, como garantir que o código no controlador seja executado depois que a variável foi definida e o filtro foi aplicado na exibição?$scope.$watch('filtered', function() { console.log('filtered:', $scope.filtered); });
person in data | filter:query as filtered | limitTo:5
. Então eu tive que usar a versão anterior a 1.3:person in filtered = (data | filter: query) | limitTo: 5
Para completar, além das respostas anteriores (execute o cálculo de pessoas visíveis dentro do controlador), você também pode executar esses cálculos no seu modelo HTML, como no exemplo abaixo.
Supondo que sua lista de pessoas seja
data
variável e você filtre as pessoas usando oquery
modelo, o código a seguir funcionará para você:{{data.length}}
- imprime o número total de pessoas{{(data|filter:query).length}}
- imprime número filtrado de pessoasObserve que esta solução funciona bem se você deseja usar dados filtrados apenas uma vez em uma página. No entanto, se você usar dados filtrados mais de uma vez, por exemplo, para apresentar itens e mostrar o comprimento da lista filtrada, sugiro usar a expressão de alias (descrita abaixo) para o AngularJS 1.3+ ou a solução proposta pela versão do @Wumms for AngularJS anterior à 1.3.
Novo recurso no Angular 1.3
Os criadores do AngularJS também notaram que o problema e na versão 1.3 (beta 17) eles adicionaram a expressão "alias" que armazenará os resultados intermediários do repetidor após a aplicação dos filtros, por exemplo
A expressão de alias impedirá vários problemas de execução de filtro.
Espero que ajude.
fonte
{{(data|filter:query|filter:query2).length}}
A maneira mais fácil se você tiver
Comprimento dos dados filtrados
fonte
O ngRepeat cria uma cópia da matriz quando aplica um filtro, portanto você não pode usar a matriz de origem para referenciar apenas os elementos filtrados.
No seu caso, pode ser melhor aplicar o filtro dentro do seu controlador usando o
$filter
serviço:E então você usa a
filteredData
propriedade em sua exibição. Aqui está um Plunker em funcionamento: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=previewfonte
{{filteredData.length}}
vez dedata.length
. Eu também entendi quemyInputModel
é o modelo mapeado para a consulta de entrada que filtra os dados.val
seria o texto digitado na entrada (basicamente consulta), mas cada vez que digito, ele muda. Mas o que temfilterFilter
aqui? Devo acrescentar que eu criei meu próprio customFilter (onde posso especificar qual chave do objeto considerar para filtragem).ng-repeat="person in filteredData"
pois não faz sentido filtrá-lo duas vezes. Com o$filter
serviço, você pode pedir um filtro específico por apenas suffixing-lo com "Filter", por exemplo:dateFilter
,jsonFilter
, etc. Se você estiver usando o seu próprio filtro personalizado, basta usar que um em vez do genéricofilterFilter
.Desde o AngularJS 1.3, você pode usar aliases:
e em algum lugar:
Dos documentos :
fonte
$scope.$watch
esse resultado com alias. Alguma dica para$broadcast
aresults
variável com alias ?Também é útil observar que você pode armazenar vários níveis de resultados agrupando filtros
aqui está um violino demo
fonte
Aqui está um exemplo trabalhado Veja no Plunker
fonte
Você pode fazer isso de duas maneiras . No modelo e no Controlador . No modelo, você pode definir sua matriz filtrada para outra variável e usá-la como desejar. Aqui está como fazê-lo:
Se você precisar de exemplos, consulte os exemplos / demonstrações de contagem filtrada do AngularJs
fonte