AngularJS'de nesne özelliğine göre filtre uygulama


139

Belirli bir özelliğin değerlerine göre nesnelerin listesini filtreleyecek AngularJS özel bir filtre oluşturmaya çalışıyorum. Bu durumda, "polarite" özelliğine ("Pozitif", "Nötr", "Negatif" olası değerleri) göre filtre uygulamak istiyorum.

İşte filtre olmadan benim çalışma kodu:

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>

JSON biçimindeki "$ scope.tweets" dizisi şunlardır:

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

En iyi filtre ben aşağıdaki gibi gelebilir:

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

Bu yöntem boş bir dizi döndürür. Ve "console.log (polarite)" deyiminden hiçbir şey yazdırılmaz. Görünüşe göre "polarite" nin nesne özelliğine erişmek için doğru parametreleri eklemiyorum.

Herhangi bir fikir? Yanıtınız büyük beğeni topluyor.


3
Güzel bir soru, ancak kod azaltılabilir, büyük kısmı soru ile ilgili değildir.
setec

Yanıtlar:


218

filterFiltreyi kullanmanız yeterlidir ( belgelere bakın ):

<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
Ng-repeat ifadesinin dışında bir ng-click olayına özel bir filtre geçirerek öğe listesini filtrelemenin bir yolu var mı? Bu durumda, derecelendirmeye göre filtre uygulayan sonuçların üzerine üç "polarite" düğmesi yerleştirmek istiyorum.
sh3nan1gans

2
Anladığımdan emin değilim. Filtrelenecek polariteyi seçmek istiyorsanız, düz metin yerine kapsam değişkeni iletebilirsiniz: filter:{polarity:polarityToFilter}burada $scope.polarityToFilterüç düğmeden birine tıklanarak doldurulur. Yapmaya çalıştığın şey bu mu?
Kara delik

Sanki işe yarayabilir. Ancak, uygulamamın ayrı liste öğelerini de silebilmesi gerekiyor.
sh3nan1gans

Filtrelemeyle ilgili sorun, her filtre uygulandığında filtrelenmiş bir öğe ile filtrelenmemiş dizideki orijinal dizini arasındaki bağı kesen yeni bir dizi oluşturulmasıdır. Kravatımı korumanın bir yolu var mı veya tek seçeneğim ng-hide mı? İşte ng-hide kullanarak filtrelemeye alternatif bir öğretici: bennadel.com/blog/…
sh3nan1gans

ngRepeat$index , kullanabileceğiniz yerel kapsamda bir özellik sunar.
Kara delik

27

Dokümantasyon tam cevabı vardır. Her neyse, bu nasıl yapılır:

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

Sadece süzer ageiçinde datadizide ve truetam eşleşme olduğunu.

Derin filtreleme için,

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

$Derin filtre için özel bir özelliktir ve trueyukarıdaki gibi tam eşlemesi içindir.


Basit ve temiz.
scaryguy

Bu filtre dahili mi yoksa Angular & AngularJS'de mi yazılması gerekiyor?
P Satish Patro

23

Bunu daha dinamik hale getirmek için de yapabilirsiniz.

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

Sonra tekrar tekrar böyle görünecek

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

Bu filtre elbette sadece polariteye göre filtrelemek için kullanılacaktır


5

Koleksiyon aşağıdaki gibi:


resim açıklamasını buraya girin

Sözdizimi:

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

Misal:

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

-VEYA-

Sözdizimi:

ng-bind="(input | filter)"

Misal:

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

4

Bunu deneyebilirsiniz. benim için çalışıyor 'adı' arr bir özelliktir.

repeat="item in (tagWordOptions | filter:{ name: $select.search } ) track by $index
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.