ng-repeat:単一フィールドによるフィルター


484

ng-repeatを使用して繰り返し使用している製品の配列があります。

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

これらの製品を色でフィルタリングします。フィルターは機能していますが、製品名/説明などに色が含まれている場合、フィルターを適用しても製品は残ります。

すべてのフィールドではなく、配列のカラーフィールドにのみ適用するようにフィルターを設定するにはどうすればよいですか?


:カスタムフィルタもパワフル=です)、あなたがそれを好むかもしれない、たとえばnoypi-linux.blogspot.com/2014/07/...
Noypi Gilas

別のソリューション:stackoverflow.com/a/24992197/257470
andrew.fox

回答:


475

フィルターページの例を参照してください。オブジェクトを使用して、colorプロパティで色を設定します。

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

マークに感謝します。この方法を以下に提案されている方法よりもこの方法で実行することに何か利点がありますか?
Tim Webster、

7
@Seglespaan、そうではありません。色でフィルタリングしていることがわかるので、bmleiteとbleshによって提示された方法の方が読みやすいかもしれません。この方法では、複数のプロパティで検索する場合に便利であるかもしれない、よりコンパクトで、あなたはかなりHTMLで長尺物を持っていないと思います: filter:{ color: '...', size: '...', ...}
マーク・Rajcok

2
@MarkRajcok、交差点ではなくユニオンを見て、複数のプロパティで検索するにはどうすればよいですか?
jetcom 2013

2
@jetcom、あなたが見る、カスタムフィルタが必要になりますstackoverflow.com/a/13845135/215945
マーク・Rajcok

1
OPが検索ボックスを作成する方法と、ページで繰り返されているng-repeatの値をフィルターで除外する方法を尋ねていたかどうかはわかりません。これの下にある答えは、尋ねられた質問に最も関連しているようです。
twknab 2017年

573

colourフィルターを適用するプロパティ(つまり)を指定します。

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

5
もし私が欲しいなら!フィルターとしてのby_colour:{colour:!by_colour} "
rjdmello 14

27
@rjdmello '!'+は次のように追加するだけ<div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
bmleite

3
わからない私はそれを正しく理解したが、私の心に来た最初のものであるか:<div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> または(同等なもの)は、このような:<div ng-repeat="product in products | filter:by">とコントローラ上:$scope.by = { 'resultsMap.annie': '!!' };。この2番目の方法では、フィルターされるプロパティをより詳細に制御できます。注:'!!'「null以外」を意味します。
bmleite 2014

2
@Federicoは、必要なときにいつでも更新customFilterできる単純なオブジェクトにするscopeことができます。このプランカーを確認してください
bmleite 2014

1
これは受け入れられる答えになるはずです。それは最も簡潔です。まあ、「色」には母音が多すぎます。
2015

176

フィルタリングする必要があるオブジェクトと一致するプロパティを持つオブジェクトでフィルタリングできます。

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が示唆したように、これはもちろん変数によって渡すことができます。


2
この種類のスコープがあるとしましょう。製品:{id:1、name: 'test'、color: 'lightblue'}、{id:2、name: 'bob'、color:[{foreground:black、background :白い}] }。次に、color:backgroundに基づいて製品をフィルタリングして白の値を取得するにはどうすればよいですか?
Gery、2014

2
@Gery:正直なところ、そうは思わない。いずれにせよ、フィルターを使用することは、IMOのような悪い習慣です。そのため、実際にはコントローラーにあるはずのロジックがビューに配置され、あまりテストできません。
Ben Lesh 2014

これは、フィルタリングをコントローラーに移動してモデルを拡張する方法です。ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html
ozkary 2015年

106

特定のオブジェクトの孫(またはより深い)でフィルタリングする場合は、オブジェクト階層を引き続き構築できます。たとえば、「thing.properties.title」でフィルタリングする場合は、次のようにできます。

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

フィルターオブジェクトに追加するだけで、オブジェクトの複数のプロパティをフィルター処理することもできます。

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

2
これは「or」タイプまたは「and」タイプのフィルターです。
SMS

1
同じ質問は、複数のプロパティをフィルタリングするときのANDまたはORですか?
lostintranslation 2015年

1
ORフィルターのみの方法はカスタムフィルターだと思います
Dmitri Algazin

99

これを行う最良の方法は、関数を使用することです。

html

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

JavaScript

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

または、ngHideまたはngShowを使用して、特定の基準に基づいて要素を動的に表示および非表示にすることもできます。


64

角度フィルターに注意してください。フィールドで特定の値を選択する場合は、フィルターを使用できません。

例:

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

以下のような使用何かこれは、両方を選択しますsubstr
ということは、あなたは「色」は「色」が「青」である「青」ではなく文字列が含まれている製品の選択をしたいです。


88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">完全一致のみで機能します(最後の「true」はコンパレータの引数です:リンク
マーク

21

色で検索:

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

あなたも内側の巣を作ることができます。

filter:{prop1:{innerprop1:searchinput}}

10

次のようにした場合:

<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>

... itemTypeId 2とitemStatus 1のアイテムを取得するだけでなく、itemType 20、22、202、123とitemStatus 10、11、101、123のアイテムも取得します。これは、フィルターが{.. 。}構文は、文字列がクエリを含むように機能します。

ただし、:true条件を追加すると、完全一致でフィルタリングされます。

<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

私のやり方はこれです

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は入力フィールドまたは好きなもの

このように表示する

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

一般的にng-ifを使用することはクリーンなソリューションです
キリゾ2017年

4

filter:{color_name:by_colour}代わりに使用する必要があります

filter:by_colour

オブジェクトの単一のプロパティと一致させたい場合は、オブジェクトの代わりにそのプロパティを記述します。そうでない場合、他のいくつかのプロパティが一致します。


1

フィルターを適用するオブジェクトのフィルターのプロパティを指定します。

//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"
}]

しかし、名だけにフィルターを適用したい

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

0

1つのフィールドのフィルターが必要な場合:

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

すべてのフィールドのフィルターが必要な場合:

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

https://docs.angularjs.org/api/ng/filter/filterあなたのために良い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.