498 votes

ng-repeat : filtre par champ unique

J'ai un tableau de produits que je répète à l'aide de ng-repeat et je me sers de

<div ng-repeat="product in products | filter:by_colour"> 

pour filtrer ces produits par couleur. Le filtre fonctionne mais si le nom du produit, sa description, etc. contient la couleur, le produit reste après l'application du filtre.

Comment puis-je configurer le filtre pour qu'il s'applique uniquement au champ de couleur de mon tableau plutôt qu'à tous les champs ?

0 votes

Les filtres personnalisés sont également puissants =), vous pourriez l'apprécier, par exemple : noypi-linux.blogspot.com/2014/07/

0 votes

Une solution différente : stackoverflow.com/a/24992197/257470

0 votes

Bon travail en épelant la couleur de la bonne façon

590voto

bmleite Points 11359

Spécifiez la propriété (c'est-à-dire colour ) où vous voulez que le filtre soit appliqué :

<div ng-repeat="product in products | filter:{ colour: by_colour }">

5 votes

Que faire si je veux ! by_colour comme filtre:{ couleur : ! by_colour }".

29 votes

@rjdmello juste prepend '!'+ comme ceci <div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">

3 votes

Je ne suis pas sûr d'avoir bien compris, mais la première chose qui m'est venue à l'esprit est : <div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> ou (quelque chose d'équivalent) comme ceci : <div ng-repeat="product in products | filter:by"> et sur le contrôleur : $scope.by = { 'resultsMap.annie': '!!' }; . Cette deuxième approche vous donne plus de contrôle sur la propriété à filtrer. Remarque : '!!' signifie "non nul".

489voto

Mark Rajcok Points 85912

Voir l'exemple sur le filtre page. Utilisez un objet, et définissez la couleur dans la propriété color :

Search by color: <input type="text" ng-model="search.color">
<div ng-repeat="product in products | filter:search">

0 votes

Merci Mark, y a-t-il des avantages à procéder de cette façon plutôt qu'avec la méthode suggérée ci-dessous ?

7 votes

@Seglespaan, pas vraiment. Vous pouvez trouver que la méthode présentée par bmleite et blesh est plus agréable à lire, puisque vous pouvez voir que vous filtrez par couleur. Cette méthode est plus compacte, ce qui peut être utile si vous souhaitez effectuer une recherche sur plusieurs propriétés et que vous préférez ne pas avoir un long objet dans le HTML : filter:{ color: '...', size: '...', ...}

2 votes

@MarkRajcok, comment pourrais-je faire une recherche sur plusieurs propriétés, en regardant l'union plutôt que l'intersection ?

177voto

Ben Lesh Points 39290

Vous pouvez filtrer sur un objet dont la propriété correspond aux objets que vous devez filtrer :

app.controller('FooCtrl', function($scope) {
   $scope.products = [
       { id: 1, name: 'test', color: 'red' },
       { id: 2, name: 'bob', color: 'blue' }
       /*... etc... */
   ];
});

<div ng-repeat="product in products | filter: { color: 'red' }"> 

Cela peut bien sûr être transmis par variable, comme l'a suggéré Mark Rajcok.

2 votes

Disons que j'ai ce genre de produits scope.products : { id : 1, name : 'test', color : 'lightblue' }, { id : 2, name : 'bob', color : [{foreground : black, background:white}] }. alors comment puis-je filtrer le produit sur la base de color:background pour obtenir la valeur blanche ?

2 votes

@Gery : Honnêtement, je ne pense pas que vous puissiez le faire. De toute façon, l'utilisation de filter : est une mauvaise pratique, IMO. En ce sens qu'il met la logique dans votre vue qui devrait vraiment être dans votre contrôleur, et n'est pas très testable.

0 votes

C'est une façon de déplacer le filtrage vers le contrôleur et d'étendre le modèle. ozkary.com/2015/05/angularjs-value-mapping-avec-dynamique.html .

108voto

David Hansen Points 42

Si vous voulez filtrer sur un petit-enfant (ou plus profond) de l'objet donné, vous pouvez continuer à construire votre hiérarchie d'objets. Par exemple, si vous souhaitez filtrer sur "thing.properties.title", vous pouvez procéder comme suit :

<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">

Vous pouvez également filtrer sur plusieurs propriétés d'un objet en les ajoutant simplement à votre objet filtre :

<div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">

2 votes

Est-ce un filtre de type "ou" ou "et" ?

1 votes

Même question : est-ce un AND ou un OR quand on filtre plus d'une propriété ?

1 votes

Pour le filtre OR, la seule solution est le filtre personnalisé, je pense.

66voto

Petr B. Points 191

Attention au filtre angulaire. Si vous voulez sélectionner une valeur spécifique dans un champ, vous ne pouvez pas utiliser le filtre.

Exemple :

javascript

app.controller('FooCtrl', function($scope) {
   $scope.products = [
       { id: 1, name: 'test', color: 'lightblue' },
       { id: 2, name: 'bob', color: 'blue' }
       /*... etc... */
   ];
});

html

<div ng-repeat="product in products | filter: { color: 'blue' }"> 

Cela permettra de sélectionner les deux, car utilisez quelque chose comme substr
Cela signifie que vous voulez sélectionner les produits dont la "couleur" contient la chaîne "bleu" et non ceux dont la "couleur" est "bleu".

89 votes

<div ng-repeat="product in products | filter: { color: 'blue' }:true"> ne fonctionnera que sur les correspondances exactes (le 'true' à la fin est l'argument du comparateur : lien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X