Comment filtrer par propriété d'objet dans angularJS

139

J'essaie de créer un filtre personnalisé dans AngularJS qui filtrera une liste d'objets par les valeurs d'une propriété spécifique. Dans ce cas, je souhaite filtrer par la propriété "polarity" (valeurs possibles de "Positive", "Neutral", "Negative").

Voici mon code de travail sans le filtre:

HTML:

<div class="total">
    <h2 id="totalTitle"></h2>
    <div>{{tweets.length}}</div>
    <div id="totalPos">{{tweets.length|posFilter}}</div>
    <div id="totalNeut">{{tweets.length|neutFilter}}</div>
    <div id="totalNeg">{{tweets.length|negFilter}}</div>
</div>

Voici le tableau "$ scope.tweets" au format JSON:

{{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user       screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"}}

Le meilleur filtre que je pourrais proposer comme suit:

myAppModule.filter('posFilter', function(){
return function(tweets){
    var polarity;
    var posFilterArray = [];
    angular.forEach(tweets, function(tweet){
        polarity = tweet.polarity;
        console.log(polarity);
        if(polarity==='Positive'){
              posFilterArray.push(tweet);
        }
        //console.log(polarity);
    });
    return posFilterArray;
};
});

Cette méthode renvoie un tableau vide. Et rien n'est imprimé à partir de l'instruction "console.log (polarité)". Il semble que je n'insère pas les paramètres corrects pour accéder à la propriété d'objet "polarity".

Des idées? Votre réponse est grandement appréciée.

sh3nan1gans
la source
3
Bonne question, mais le code pourrait être réduit, une grande partie n'est pas pertinente par rapport à la question.
setec

Réponses:

218

Il vous suffit d'utiliser le filterfiltre (voir la documentation ):

<div id="totalPos">{{(tweets | filter:{polarity:'Positive'}).length}}</div>
<div id="totalNeut">{{(tweets | filter:{polarity:'Neutral'}).length}}</div>
<div id="totalNeg">{{(tweets | filter:{polarity:'Negative'}).length}}</div>

Fiddle

Trou noir
la source
1
Existe-t-il un moyen de filtrer la liste d'éléments en passant un filtre personnalisé à un événement ng-click en dehors de l'instruction ng-repeat? Dans ce cas, je souhaite placer trois boutons de «polarité» au-dessus des résultats qui filtrent en fonction de l'évaluation.
sh3nan1gans
2
Je ne suis pas sûr de comprendre. Si vous souhaitez choisir la polarité à filtrer, vous pouvez passer une variable de portée au lieu d'un texte brut: filter:{polarity:polarityToFilter}$scope.polarityToFilterest rempli par un clic sur l'un des trois boutons. Est-ce ce que vous essayez de faire?
Blackhole
Cela semble pouvoir fonctionner. Cependant, mon application doit également pouvoir supprimer des éléments de liste individuels.
sh3nan1gans
Le problème avec le filtrage est qu'un nouveau tableau est créé chaque fois qu'un filtre est appliqué, ce qui rompt le lien entre un élément filtré et son index d'origine dans le tableau non filtré. Existe-t-il un moyen de maintenir la cravate ou est-ce que ng-hide est ma seule option? Voici un tutoriel pour une alternative au filtrage en utilisant ng-hide: bennadel.com/blog/…
sh3nan1gans
ngRepeat expose une $indexpropriété sur l'étendue locale que vous pouvez également utiliser.
Blackhole
27

La documentation a la réponse complète. Quoi qu'il en soit, voici comment procéder:

<input type="text" ng-model="filterValue">
<li ng-repeat="i in data | filter:{age:filterValue}:true"> {{i | json }}</li>

filtrera uniquement agedans le datatableau et trueest pour la correspondance exacte.

Pour un filtrage en profondeur,

<li ng-repeat="i in data | filter:{$:filterValue}:true"> {{i}}</li>

Le $est une propriété spéciale pour le filtre profond et trueest pour la correspondance exacte comme ci-dessus.

Abel Terefe
la source
Simple et propre.
scaryguy
Ce filtre est-il intégré ou doit-il être écrit à la fois en Angular et AngularJS?
P Satish Patro
23

Vous pouvez également le faire pour le rendre plus dynamique.

<input name="filterByPolarity" data-ng-model="text.polarity"/>

Ensuite, vous ng-répétez ressemblera à ceci

<div class="tweet" data-ng-repeat="tweet in tweets | filter:text"></div>

Ce filtre ne sera bien sûr utilisé que pour filtrer par polarité

Llewellyn Collins
la source
5

Nous avons la collection comme ci-dessous:


entrez la description de l'image ici

Syntaxe:

{{(Collection/array/list | filter:{Value : (object value)})[0].KeyName}}

Exemple:

{{(Collectionstatus | filter:{Value:dt.Status})[0].KeyName}}

-OU-

Syntaxe:

ng-bind="(input | filter)"

Exemple:

ng-bind="(Collectionstatus | filter:{Value:dt.Status})[0].KeyName"
Rahul Modi
la source
4

Vous pouvez essayer ceci. son travail pour moi «nom» est une propriété dans l'arr.

repeat="item in (tagWordOptions | filter:{ name: $select.search } ) track by $index
Satish Singh
la source