ng-repeat: lọc theo trường đơn


484

Tôi có một loạt các sản phẩm tôi đang lặp lại bằng cách sử dụng ng-repeat và đang sử dụng

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

để lọc các sản phẩm này theo màu sắc. Bộ lọc đang hoạt động nhưng nếu tên sản phẩm / mô tả vv chứa màu thì sản phẩm vẫn còn sau khi bộ lọc được áp dụng.

Làm cách nào để đặt bộ lọc chỉ áp dụng cho trường màu của mảng chứ không phải mọi trường?


Bộ lọc tùy chỉnh cũng là mạnh mẽ =), bạn có thể thích nó, ví dụ: noypi-linux.blogspot.com/2014/07/...
Noypi Gilas


Công việc tuyệt vời đánh vần màu đúng cách
MikeKulls

Câu trả lời:


475

Xem ví dụ trên trang bộ lọc . Sử dụng một đối tượng và đặt màu trong thuộc tính màu:

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

Cảm ơn Mark, có bất kỳ lợi ích nào khi làm theo cách này hơn là phương pháp được đề xuất dưới đây không?
Tim Webster

7
@Seglespaan, không hẳn. Bạn có thể thấy rằng phương pháp được trình bày bởi bmleite và b thịt đọc đẹp hơn, vì bạn có thể thấy rằng bạn đang lọc theo màu. Phương pháp này nhỏ gọn hơn, có thể hữu ích nếu bạn muốn tìm kiếm theo nhiều thuộc tính và bạn không muốn có một đối tượng dài trong HTML: filter:{ color: '...', size: '...', ...}
Mark Rajcok

2
@MarkRajcok, làm thế nào tôi có thể tìm kiếm theo nhiều thuộc tính, nhìn vào liên minh, thay vì giao lộ?
jetcom

2
@jetcom, bạn sẽ cần một bộ lọc tùy chỉnh, xem stackoverflow.com/a/13845135/215945
Mark Rajcok 31/12/13

1
Tôi không biết liệu OP có hỏi cách tạo hộp tìm kiếm nhiều như cách lọc các giá trị trong một lần lặp lại khi chúng lặp lại trên trang không. Câu trả lời bên dưới câu hỏi này có vẻ phù hợp nhất với câu hỏi được hỏi.
twknab

573

Chỉ định thuộc tính (nghĩa là colour) nơi bạn muốn áp dụng bộ lọc:

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

5
nếu tôi muốn by_colour dưới dạng bộ lọc: {color :! by_colour} "
rjdmello

27
@rjdmello chỉ cần trả trước '!'+, như thế này<div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
bmleite

3
Không chắc tôi có hiểu đúng không, nhưng điều đầu tiên xuất hiện trong đầu tôi là: <div ng-repeat="product in products | filter:{ resultsMap.annie: '!!' }"> hoặc (một cái gì đó tương đương) như thế này: <div ng-repeat="product in products | filter:by">và trên bộ điều khiển : $scope.by = { 'resultsMap.annie': '!!' };. Cách tiếp cận thứ hai này cho phép bạn kiểm soát nhiều hơn đối với tài sản đang được lọc. Lưu ý: '!!'có nghĩa là "không null".
bmleite

2
@Federico, customFiltercó thể là một đối tượng đơn giản scopemà bạn cập nhật bất cứ khi nào cần. Kiểm tra plunker này .
bmleite

1
Đây phải là câu trả lời được chấp nhận. Đó là cô đọng nhất. Chà, ngoại trừ 'màu' có quá nhiều nguyên âm.
Rap

176

Bạn có thể lọc theo một đối tượng có thuộc tính khớp với các đối tượng bạn phải lọc trên đó:

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

Điều này tất nhiên có thể được thông qua bởi biến, như Mark Rajcok đề xuất.


2
hãy nói rằng tôi có loại scope.products: {id: 1, name: 'test', color: 'lightblue'}, {id: 2, name: 'bob', color: [{foreground: black, nền :trắng}] }. Sau đó, làm thế nào tôi có thể lọc sản phẩm dựa trên màu sắc: nền để có giá trị trắng?
Gery

2
@Gery: Thành thật mà nói, tôi không nghĩ bạn có thể. Dù bằng cách nào, sử dụng bộ lọc: tất cả là loại thực hành xấu, IMO. Trong đó, nó đặt logic theo quan điểm của bạn mà thực sự phải nằm trong bộ điều khiển của bạn và không thể kiểm chứng được.
Ben Lesh

Đây là một cách để di chuyển bộ lọc sang bộ điều khiển và mở rộng mô hình. ozkary.com/2015/05/angularjs-value-mapping-with-dynamic.html .
ozkary

106

Nếu bạn muốn lọc trên một đứa cháu (hoặc sâu hơn) của đối tượng đã cho, bạn có thể tiếp tục xây dựng hệ thống phân cấp đối tượng của mình. Ví dụ: nếu bạn muốn lọc trên 'thing.properIES.title', bạn có thể thực hiện các thao tác sau:

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

Bạn cũng có thể lọc trên nhiều thuộc tính của một đối tượng chỉ bằng cách thêm chúng vào đối tượng bộ lọc của bạn:

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

2
đây là loại 'hoặc' loại hoặc 'và' loại bộ lọc.
sms

1
Câu hỏi tương tự là AND và OR khi lọc nhiều hơn một thuộc tính?
lostintranslation

1
Đối với cách chỉ bộ lọc OR là bộ lọc tùy chỉnh, tôi nghĩ
Dmitri Algazin

99

Cách tốt nhất để làm điều này là sử dụng một chức năng:

html

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

javascript

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

Ngoài ra, bạn có thể sử dụng ngHide hoặc ngShow để hiển thị động và ẩn các phần tử dựa trên một tiêu chí nhất định.


64

Hãy cẩn thận với bộ lọc góc. Nếu bạn muốn chọn giá trị cụ thể trong trường, bạn không thể sử dụng bộ lọc.

Thí dụ:

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

Điều này sẽ chọn cả hai, vì sử dụng một cái gì đó như substr
Điều đó có nghĩa là bạn muốn chọn sản phẩm trong đó "màu" chứa chuỗi "màu xanh" chứ không phải "màu" là "màu xanh".


88
<div ng-repeat="product in products | filter: { color: 'blue' }:true">sẽ chỉ hoạt động trên các kết quả khớp chính xác ('đúng' ở cuối là đối số so sánh: liên kết
Đánh dấu

21

Tìm kiếm theo màu sắc:

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

bạn có thể làm một tổ bên trong quá.

filter:{prop1:{innerprop1:searchinput}}

10

Nếu bạn đã làm như sau:

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

... bạn sẽ không chỉ nhận được các mục của itemTypeId 2 và itemStatus 1, mà bạn còn nhận được các mục với itemType 20, 22, 202, 123 và itemStatus 10, 11, 101, 123. Điều này là do bộ lọc: {.. .} cú pháp hoạt động giống như một chuỗi chứa truy vấn.

Tuy nhiên, nếu bạn đã thêm : điều kiện đúng , nó sẽ lọc theo kết hợp chính xác:

<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

cách của tôi là thế này

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

phụ là trường Nhập liệu hoặc bất cứ thứ gì bạn thích

Hiển thị như thế này

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

Nói chung, sử dụng ng-if là một giải pháp sạch
Kilizo

4

Bạn phải sử dụng filter:{color_name:by_colour}thay vì

filter:by_colour

Nếu bạn muốn khớp với một thuộc tính duy nhất của một đối tượng, thì hãy viết thuộc tính đó thay vì đối tượng, nếu không một số thuộc tính khác sẽ được khớp.


1

Chỉ định thuộc tính trong bộ lọc, của đối tượng mà bạn muốn áp dụng bộ lọc:

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

Nhưng bạn muốn chỉ áp dụng bộ lọc trên tên đầu tiên

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

0

Nếu bạn muốn lọc cho một trường:

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

Nếu bạn muốn lọc cho tất cả các lĩnh vực:

 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 tốt cho bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.