J'ai un tableau de données qui contient de nombreux objets (format JSON). Les éléments suivants peuvent être considérés comme le contenu de ce tableau:
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
Maintenant, j'affiche ces détails comme:
<div ng-repeat="person in data | filter: query">
</div
Ici, la requête est modélisée dans un champ de saisie dans lequel l'utilisateur peut restreindre les données affichées.
Maintenant, j'ai un autre emplacement dans lequel j'affiche le nombre actuel de personnes / personne étant affiché, à savoir Showing {{data.length}} Persons
Ce que je veux faire, c'est que lorsque l'utilisateur recherche une personne et que les données affichées sont filtrées en fonction de la requête, cela Showing...persons
modifie également la valeur des personnes affichées actuellement. Mais cela ne se produit pas. Il affiche toujours le nombre total de personnes dans les données plutôt que celui filtré - comment puis-je obtenir le nombre de données filtrées?
la source
$scope.filtered.length
.undefined
, probablement parce qu'au moment de la journalisation, la variable n'est pas encore définie. Alors, comment puis-je m'assurer que le code dans le contrôleur est exécuté après la définition de la variable et l'application du filtre dans la vue?$scope.$watch('filtered', function() { console.log('filtered:', $scope.filtered); });
person in data | filter:query as filtered | limitTo:5
. J'ai donc dû utiliser la version antérieure à 1.3:person in filtered = (data | filter: query) | limitTo: 5
Pour être complet, en plus des réponses précédentes (effectuer le calcul des personnes visibles à l'intérieur du contrôleur), vous pouvez également effectuer ces calculs dans votre modèle HTML comme dans l'exemple ci-dessous.
En supposant que votre liste de personnes est
data
variable et que vous filtrez les personnes à l'aide duquery
modèle, le code suivant fonctionnera pour vous:{{data.length}}
- imprime le nombre total de personnes{{(data|filter:query).length}}
- imprime le nombre de personnes filtréNotez que cette solution fonctionne correctement si vous souhaitez utiliser les données filtrées une seule fois dans une page. Cependant, si vous utilisez des données filtrées plus d'une fois, par exemple pour présenter des éléments et afficher la longueur de la liste filtrée, je suggère d'utiliser l' expression d'alias (décrite ci-dessous) pour AngularJS 1.3+ ou la solution proposée par @Wumms pour AngularJS version antérieure à 1.3.
Nouvelle fonctionnalité dans Angular 1.3
Les créateurs d'AngularJS ont également remarqué ce problème et dans la version 1.3 (beta 17), ils ont ajouté l'expression "alias" qui stockera les résultats intermédiaires du répéteur après l'application des filtres, par exemple
L' expression d'alias empêchera plusieurs problèmes d'exécution de filtre.
J'espère que cela aidera.
la source
{{(data|filter:query|filter:query2).length}}
La façon la plus simple si vous avez
Longueur des données filtrées
la source
ngRepeat crée une copie du tableau lorsqu'il applique un filtre, vous ne pouvez donc pas utiliser le tableau source pour référencer uniquement les éléments filtrés.
Dans votre cas, il peut être préférable d'appliquer le filtre à l'intérieur de votre contrôleur en utilisant le
$filter
service:Et puis vous utilisez la
filteredData
propriété dans votre vue à la place. Voici un Plunker fonctionnel: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=previewla source
{{filteredData.length}}
place dedata.length
. J'ai également compris quemyInputModel
c'est le modèle mappé à la requête d'entrée qui filtre les données.val
serait le texte qui est tapé dans l'entrée (essentiellement une requête) mais chaque fois que je tape, il change. Mais qu'y a-filterFilter
t-il ici? Je pourrais ajouter que j'ai créé mon propre filtre personnalisé (dans lequel je peux spécifier la clé de l'objet à prendre en compte pour le filtrage).ng-repeat="person in filteredData"
car il n'y a aucun sens à le filtrer deux fois. Avec le$filter
service, vous pouvez demander un filtre spécifique en tout suffixant avec « Filtre », par exemple:dateFilter
,jsonFilter
, etc. Si vous utilisez votre propre filtre personnalisé, il suffit d' utiliser que l' on place du génériquefilterFilter
.Depuis AngularJS 1.3, vous pouvez utiliser des alias:
et quelque part:
Depuis les documents :
la source
$scope.$watch
à ce résultat aliasé. Des conseils pour$broadcast
ing laresults
variable aliasée ?Il est également utile de noter que vous pouvez stocker plusieurs niveaux de résultats en regroupant les filtres
voici un violon de démonstration
la source
Voici l'exemple travaillé Voir sur Plunker
la source
Vous pouvez le faire de 2 manières . Dans le modèle et dans le contrôleur . Dans le modèle, vous pouvez définir votre tableau filtré sur une autre variable, puis l'utiliser comme vous le souhaitez. Voici comment faire:
Si vous avez besoin d'exemples, consultez les exemples / démos de comptage filtré AngularJs
la source