ng-repeat: tek alana göre filtrele


484

Ben ng-repeat kullanarak tekrar ediyorum bir dizi ürün var ve kullanıyorum

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

Bu ürünleri renge göre filtrelemek için. Filtre çalışıyor ancak ürün adı / açıklaması vb. Renk içeriyorsa, filtre uygulandıktan sonra ürün kalır.

Filtreyi her alan yerine dizimin renk alanına uygulanacak şekilde nasıl ayarlarım?


Özel filtreler de güçlüdür =), beğenebilirsiniz, örnek: noypi-linux.blogspot.com/2014/07/…
Noypi Gilas


Harika iş yazım rengi doğru şekilde
MikeKulls

Yanıtlar:


475

Filtre sayfasındaki örneğe bakın . Bir nesne kullanın ve color özelliğinde rengi ayarlayın:

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

Teşekkürler Mark, aşağıda önerilen yöntem yerine, bu şekilde yapmanın herhangi bir faydası var mı?
Tim Webster

7
@Seglespaan, pek değil. Bmleite ve blesh tarafından sunulan yöntemin daha iyi okuduğunu görebilirsiniz, çünkü renge göre filtrelediğinizi görebilirsiniz. Bu yöntem daha küçüktür; bu, birden çok özelliğe göre arama yapmak istiyorsanız yararlı olabilir ve HTML'de uzun bir nesne kullanmak istemezsiniz: filter:{ color: '...', size: '...', ...}
Mark Rajcok

2
@MarkRajcok, kavşaktan ziyade birliğe bakarak birden çok mülkle nasıl arama yapabilirim?
jetcom

2
@jetcom, özel bir filtreye ihtiyacınız olacak, bkz. stackoverflow.com/a/13845135/215945
Mark Rajcok

1
OP, bir sayfa tekrarlama sırasında bir ng-tekrar değerleri filtre nasıl kadar bir arama kutusu yapmak için soruyordu olup olmadığını bilmiyorum. Bunun cevabı, sorulan soru ile en alakalı görünmektedir.
twknab

573

colourFiltrenin uygulanmasını istediğiniz özelliği (yani ) belirtin :

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

5
ne istersem! filtre olarak by_colour: {renk:! by_colour} "
rjdmello

27
@rjdmello sadece '!'+böyle <div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
başlıyor

3
Eğer doğru anladım, ama emin değil aklıma gelen ilk şeydi: <div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> ya böyle (bir şey eşdeğeri): <div ng-repeat="product in products | filter:by">ve denetleyici tarih: $scope.by = { 'resultsMap.annie': '!!' };. Bu ikinci yaklaşım, filtrelenen mülk üzerinde daha fazla kontrol sahibi olmanızı sağlar. Not: '!!'"boş değil" anlamına gelir.
bmleite

2
@Federico, ihtiyacınız olduğunda güncellediğiniz customFilterbasit bir nesne olabilir scope. Bu pistonu kontrol et .
bmleite

1
Bu kabul edilen cevap olmalı. En özlü. Bunun dışında 'renk' çok sesli harflere sahip.
Rap

176

Üzerinde filtrelemeniz gereken nesnelerle eşleşen bir özelliğe sahip bir nesneye göre filtre uygulayabilirsiniz:

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

Mark Rajcok'un önerdiği gibi, bu elbette değişken tarafından aktarılabilir.


2
diyelim ki bu tür bir kapsamım var. ürünler: {id: 1, ad: 'test', renk: 'lightblue'}, {id: 2, ad: 'bob', renk: [{ön plan: siyah, arka plan : beyaz}]}. o zaman beyaz renk elde etmek için ürünü renge göre nasıl filtreleyebilirim?
Gery

2
@Gery: Dürüst olmak gerekirse, yapabileceğini sanmıyorum. Her iki durumda da, filtre kullanmak: hiç de kötü bir uygulama IMO. Bu, gerçekten kontrol cihazınızda olması gereken mantığı ortaya koyar ve çok test edilemez.
Ben Lesh

Bu, filtrelemeyi denetleyiciye taşımanın ve modeli genişletmenin bir yoludur. ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html .
ozkary

106

Belirli bir nesnenin torununa (veya daha derinine) filtre uygulamak istiyorsanız, nesne hiyerarşinizi oluşturmaya devam edebilirsiniz. Örneğin, 'thing.properties.title' öğesine filtre uygulamak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

Ayrıca, bir nesneyi birden çok özelliğine filtre nesnesine ekleyerek de filtreleyebilirsiniz:

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

2
'veya' tür 'veya' ve 'filtre türü gibidir.
sms

1
Aynı soru, birden fazla özelliği filtrelerken AND veya OR mi?
lostintranslation

1
VEYA filtre için tek yol özel filtre, sanırım
Dmitri Algazin

99

Bunu yapmanın en iyi yolu bir işlev kullanmaktır:

html

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

javaScript

$scope.myFilter = function (item) { 
    return item === 'red' || item === 'blue'; 
};

Alternatif olarak, öğeleri belirli bir ölçütlere göre dinamik olarak göstermek ve gizlemek için ngHide veya ngShow'u kullanabilirsiniz.


64

Açısal filtreye dikkat edin. Alanda belirli bir değer seçmek istiyorsanız, filtre kullanamazsınız.

Misal:

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

Bu her ikisini de seçecektir, çünkü substr
Bu, "color" (renk) "blue" (mavi) değil, "color" (renk) "string" (mavi) içeren bir ürün seçmek istediğiniz anlamına gelir.


88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">yalnızca tam eşleşmeler üzerinde çalışacaktır (sondaki 'true' karşılaştırıcı argümanıdır: link
Mark

21

Renge göre ara:

<input type="text" ng-model="searchinput">
<div ng-repeat="product in products | filter:{color:searchinput}">

iç yuva da yapabilirsiniz.

filter:{prop1:{innerprop1:searchinput}}

10

Aşağıdakileri yapacaksanız:

<li class="active-item" ng-repeat="item in mc.pageData.items | filter: { itemTypeId: 2, itemStatus: 1 } | orderBy : 'listIndex'"
                id="{{item.id}}">
    <span class="item-title">{{preference.itemTitle}}</span>
</li>

... sadece itemTypeId 2 ve itemStatus 1 öğelerini almakla kalmaz, aynı zamanda itemType 20, 22, 202, 123 ve itemStatus 10, 11, 101, 123 öğelerini de alırsınız. Bunun nedeni filtre: {.. sözdizimi bir dize sorgusu içerir gibi çalışır.

Ancak ,: true koşulunu ekleyecekseniz, tam eşlemeye göre filtre yapar:

<li class="active-item" ng-repeat="item in mc.pageData.items | filter: { itemTypeId: 2, itemStatus: 1 } : true | orderBy : 'listIndex'"
                id="{{item.id}}">
    <span class="item-title">{{preference.itemTitle}}</span>
</li>

4

benim yolum bu

subjcts is

[{"id":"1","title":"GFATM"},{"id":"2","title":"Court Case"},{"id":"3","title":"Renewal\/Validity"},{"id":"4","title":"Change of Details"},{"id":"5","title":"Student Query"},{"id":"6","title":"Complains"}]

sub bir Giriş alanıdır ya da ne istersen

Bu şekilde görüntüleniyor

<div ng-if="x.id === sub" ng-repeat=" x in subjcts">{{x.title}}</div>

Genel olarak ng-if kullanımı temiz bir çözümdür
Kilizo

4

Sen kullanmalıdır filter:{color_name:by_colour}yerine

filter:by_colour

Bir nesnenin tek bir özelliğiyle eşleştirmek istiyorsanız, nesne yerine bu özelliği yazın, aksi takdirde diğer bazı özellikler eşleşir.


1

Filtre uygulamak istediğiniz nesnenin filtredeki özelliğini belirtin:

//Suppose Object
var users = [{
  "firstname": "XYZ",
  "lastname": "ABC",
  "Address": "HOUSE NO-1, Example Street, Example Town"
},
{
  "firstname": "QWE",
  "lastname": "YUIKJH",
  "Address": "HOUSE NO-11, Example Street1, Example Town1"
}]

Ancak filtreyi yalnızca ad üzerine uygulamak istiyorsunuz

<input type = "text" ng-model = "first_name_model"/>
<div ng-repeat="user in users| filter:{ firstname: first_name_model}">

0

Bir alan için filtre istiyorsanız:

label>Any: <input ng-model="search.color"></label> <br>
<tr ng-repeat="friendObj in friends | filter:search:strict">

Tüm alan için filtre istiyorsanız:

 label>Any: <input ng-model="search.$"></label> <br>
 <tr ng-repeat="friendObj in friends | filter:search:strict">

ve https://docs.angularjs.org/api/ng/filter/filter sizin için iyi

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.