2013-07-22 10 views
124

Ich versuche, einen benutzerdefinierten Filter in AngularJS zu erstellen, der eine Liste von Objekten nach den Werten einer bestimmten Eigenschaft filtern wird. In diesem Fall möchte ich nach der Eigenschaft "Polarität" filtern (mögliche Werte von "Positiv", "Neutral", "Negativ").Wie nach Objekteigenschaften in angularJS zu filtern ist

Hier ist mein Arbeits Code ohne Filter:

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> 

Hier ist das Array "$ scope.tweets" im JSON-Format:

{{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"}} 

Der beste Filter, den ich mir vorstellen konnte:

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; 
}; 
}); 

Diese Methode gibt ein leeres Array zurück. Und nichts wird von der "console.log (Polarität)" Anweisung gedruckt. Es scheint, als ob ich nicht die richtigen Parameter einfüge, um auf die Objekteigenschaft "Polarität" zuzugreifen.

Irgendwelche Ideen? Ihre Antwort wird sehr geschätzt.

+3

Nizza Frage, aber Code reduziert werden könnte, großer Teil davon ist nicht relevant zur Frage. – setec

Antwort

203

Sie müssen einfach die filter Filter verwenden (siehe die 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

+1

Nailed it! Danke – sh3nan1gans

+0

Gibt es eine Möglichkeit, die Elementliste zu filtern, indem Sie einen benutzerdefinierten Filter an ein ng-click-Ereignis außerhalb der ng-repeat-Anweisung übergeben? In diesem Fall möchte ich drei "Polarität" -Schaltflächen über den Ergebnissen platzieren, die basierend auf der Bewertung filtern. – sh3nan1gans

+2

Ich bin mir nicht sicher, zu verstehen. Wenn Sie die zu filternde Polarität auswählen möchten, können Sie anstelle eines einfachen Textes eine Bereichsvariable übergeben: '' 'filter: {polarität: polarityToFilter}' '' wobei '' '$ scope.polarityToFilter''' mit a gefüllt wird Klicken Sie auf eine der drei Schaltflächen. Ist das, was du versuchst zu tun? – Blackhole

21

Sie könnten auch dies tun, um es dynamischer zu machen.

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

Dazu ng-Repeat sieht wie diese

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

Diese Filter werden nur natürlich verwendet werden, indem die Polarität zu filtern

24

Die documentation hat die vollständige Antwort. Wie auch immer das ist, wie es gemacht wird:

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

filtert nur age in data Array und true ist für genaue Übereinstimmung.

Für tiefe Filterung,

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

Die $ ist eine spezielle Eigenschaft für Tiefenfilter und die true für genaue Übereinstimmung ist oben wie.

+0

Einfach und sauber. – scaryguy

3

Sie können dies versuchen. es funktioniert für mich 'name' ist eine Eigenschaft in arr.

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

Wir haben Sammlung wie folgt:


enter image description here

Syntax:

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

Beispiel:

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

-ODER-

Syntax:

ng-bind="(input | filter)" 

Beispiel:

ng-bind="(Collectionstatus | filter:{Value:dt.Status})[0].KeyName" 
Verwandte Themen