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

สีสะกดที่ยอดเยี่ยมในการทำงานอย่างถูกวิธี
MikeKulls

คำตอบ:


475

ดูตัวอย่างในหน้าตัวกรอง ใช้วัตถุและตั้งค่าสีในคุณสมบัติสี:

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

ขอบคุณมาร์คมีประโยชน์ใด ๆ ในการทำเช่นนี้มากกว่าวิธีที่แนะนำด้านล่างหรือไม่
ทิมเว็บสเตอร์

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 เมื่อพวกเขาทำซ้ำในหน้า คำตอบใต้คำถามนี้ดูเหมือนจะเกี่ยวข้องกับคำถามที่ถามมากที่สุด
twknab

573

ระบุคุณสมบัติ (เช่นcolour) ที่คุณต้องการใช้ตัวกรอง:

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

5
ถ้าฉันต้องการ! by_colour as filter: {color:! 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, ชื่อ: 'test', color: 'lightblue'}, {id: 2, ชื่อ: 'bob', สี: [{foreground: black, background : white}]} ฉันจะกรองผลิตภัณฑ์ตามสี: พื้นหลังเพื่อรับค่าสีขาวได้อย่างไร
Gery

2
@Gery: สุจริตฉันไม่คิดว่าคุณสามารถ ไม่ว่าจะด้วยวิธีใดก็ตามการใช้ตัวกรอง: IMO ซึ่งทำให้ตรรกะในมุมมองของคุณที่ควรจะอยู่ในตัวควบคุมของคุณและไม่สามารถทดสอบได้มากนัก
เบ็นเลช

นี่เป็นวิธีย้ายตัวกรองไปยังตัวควบคุมและขยายแบบจำลอง 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
ตัวกรองนี้เป็นตัวกรองประเภท 'หรือ' หรือ 'และ' และ '
sms

1
คำถามเดียวกันคือ AND และหรือ OR เมื่อกรองมากกว่าหนึ่งคุณสมบัติ?
สูญเสียการแปล

1
สำหรับตัวกรองหรือวิธีเดียวคือตัวกรองที่กำหนดเองฉันคิดว่า
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
นั่นหมายความว่าคุณต้องการเลือกผลิตภัณฑ์โดยที่ "สี" มีสตริง "สีน้ำเงิน" และไม่ใช่ตำแหน่งที่ "สี" เป็น "สีฟ้า"


88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">จะทำงานกับการแข่งขันที่แน่นอนเท่านั้น ('ที่แท้จริง' ในตอนท้ายคืออาร์กิวเมนต์ตัวเปรียบเทียบ: ลิงก์
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 นี่เป็นเพราะตัวกรอง: {.. .} ไวยากรณ์ทำงานเหมือนสตริงมีคิวรี

อย่างไรก็ตามหากคุณต้องเพิ่มเงื่อนไข: จริงมันจะกรองตามการจับคู่ที่แน่นอน:

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