ng-repeat : 단일 필드로 필터링


484

ng-repeat를 사용하여 반복하고 사용중인 제품이 있습니다.

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

이러한 제품을 색상별로 필터링합니다. 필터가 작동하지만 제품 이름 / 설명 등에 색상이 포함 된 경우 필터가 적용된 후에도 제품이 유지됩니다.

필터를 모든 필드가 아닌 배열의 색상 필드에만 적용하도록 설정하는 방법은 무엇입니까?


사용자 정의 필터도 강력합니다. =) 예 : noypi-linux.blogspot.com/2014/07/…
Noypi Gilas


훌륭한 철자법 맞춤법 올바른 색상
MikeKulls

답변:


475

필터 페이지 의 예를 참조하십시오. 객체를 사용하고 색상 속성에서 색상을 설정하십시오.

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: '...', ...}
Mark Rajcok

2
@MarkRajcok, 교차점이 아닌 조합을 보면서 여러 속성으로 어떻게 검색 할 수 있습니까?
jetcom

2
@jetcom, 사용자 정의 필터가 필요합니다. stackoverflow.com/a/13845135/215945
Mark Rajcok

1
OP가 페이지에서 반복 될 때 ng-repeat의 값을 필터링하는 방법뿐만 아니라 검색 상자를 만드는 방법을 묻고 있는지 모르겠습니다. 이 답변 아래에있는 답변은 질문과 관련이있는 것 같습니다.
twknab

573

colour필터를 적용 할 속성 (예 :)을 지정하십시오 .

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

5
내가 원한다면 어떡해! by_colour as filter : {색상 :! by_colour} "
rjdmello

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': '!!' };. 이 두 번째 방법은 필터링 할 속성을보다 강력하게 제어합니다. 참고 : '!!'"널이 아님"을 의미합니다.
bmleite

2
@Federico는 필요할 때마다 업데이트 customFilter하는 간단한 객체가 될 수 있습니다 scope. 이 플 런커를 확인하십시오 .
bmleite

1
이것이 정답입니다. 가장 간결합니다. 음, '컬러'에는 모음이 너무 많습니다.

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
내가 이런 종류의 scope.products를 가지고 있다고 말할 수 있습니다 : {id : 1, name : 'test', color : 'lightblue'}, {id : 2, name : 'bob', color : [{foreground : black, background :하얀}] }. 그런 다음 색상을 기준으로 제품을 필터링하여 흰색 값을 얻으려면 어떻게해야합니까?
Gery

2
@Gery : 솔직히, 나는 당신이 할 수 있다고 생각하지 않습니다. 어느 쪽이든, 필터 :를 사용하는 것은 전혀 나쁜 습관입니다. 그것은 실제로 컨트롤러에 있어야하며 매우 테스트 할 수없는 논리를보기에 넣습니다.
Ben Lesh

이것은 필터링을 컨트롤러로 옮기고 모델을 확장하는 방법입니다. ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html .
ozkary

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

1
OR 필터 전용 방식은 맞춤 필터입니다.
Dmitri Algazin

99

이를 수행하는 가장 좋은 방법은 함수를 사용하는 것입니다.

html

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

자바 스크립트

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

또는 ngHide 또는 ngShow를 사용하여 특정 기준에 따라 요소를 동적으로 표시하거나 숨길 수 있습니다.


64

각도 필터에주의하십시오. 필드에서 특정 값을 선택하려면 필터를 사용할 수 없습니다.

예:

자바 스크립트

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
"color"가 "blue"가 아니라 "color"에 "blue"문자열이 포함 된 제품을 선택해야한다는 의미 이므로 둘 다 선택합니다 .


88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">정확히 일치하는 경우에만 작동합니다 (끝의 '참'은 비교 자 인수입니다. link
Mark

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를 사용하는 것은 깨끗한 솔루션입니다
Kilizo

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

한 필드에 대해 필터를 원할 경우 :

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.