2014-12-22 20 views
46

Nếu tôi có đối tượng phức tạp với đối tượng làm giá trị thuộc tính, làm cách nào tôi có thể lọc theo một trong các thuộc tính lồng nhau?ngRepeat Lọc theo thuộc tính sâu

Điều này có thể thực hiện với bộ lọc ng-lặp OOB không?

liệu

{ 
    Name: 'John Smith', 
    Manager: { 
    id: 123, 
    Name: 'Bill Lumburg' 
    } 
} 

ngRepeat

<li ng-repeat="e in emps | filter:Manager.Name">{{ e.Name }}</li> 

Trả lời

97

Bạn cần phải vượt qua trong đối số để lọc theo:

<input ng-model="filter.key"> 
<ul> 
    <li ng-repeat="e in list | filter: {Manager: {Name: filter.key}}"> 
    {{e.Name}} (Manager: {{e.Manager.Name}}) 
    </li> 
</ul> 

Example on Plunker

+2

Nếu một số đối tượng không có tài sản quản lý họ sẽ không xuất hiện ngay cả khi bộ lọc trống. Bạn có biết cách bao gồm chúng không? – Bludwarf

+1

Nếu Tên là một mảng và tôi chỉ muốn lọc Tên Đầu tiên? – rocketspacer

+1

@Bludwarf http://plnkr.co/edit/dMbYapbySJMGKiykvpG7?p=preview có lẽ điều này có thể giúp ai đó – ANinJa

1

Trong phiên bản mới nhất của angularjs bộ lọc obj lồng nhau được thực hiện theo mặc định.can sử dụng bộ lọc bình thường.

+0

Kính gửi @Murali trên giải pháp chỉ dành cho góc 1. –

2

Để lọc với nhiều thuộc tính sâu, chúng tôi cần tạo bộ lọc tùy chỉnh. Những gì tôi có nghĩa là chúng ta cần phải tạo ra chức năng riêng của chúng tôi để lọc dữ liệu trong đối tượng và trả về đối tượng yêu cầu (đối tượng được lọc).

Ví dụ tôi cần để lọc dữ liệu từ bên dưới đối tượng -

[ 
{ 
    "document":{ 
     "documentid":"1", 
     "documenttitle":"test 1", 
     "documentdescription":"abcdef" 
     } 
}, 
{ 
    "document":{ 
     "documentid":"2", 
     "documenttitle":"dfjhkjhf", 
     "documentdescription":"dfhjshfjdhsj" 
     } 
} 
] 

Trong HTML chúng tôi sử dụng ng-repeat để hiển thị danh sách tài liệu -

<div> 
    //search input textbox 
    <input ng-model="searchDocument" placeholder="Search"> 
</div> 
<div ng-repeat="document in documentList | filter: filteredDocument"> 
    //our html code 
</div> 

Trong điều khiển chúng tôi viết chức năng lọc trở lại đối tượng được lọc bằng cách sử dụng hai thuộc tính của đối tượng là "documenttitle" và "documentdescription", ví dụ mã như sau -

function filterDocuments(document) 
     { 
      if($scope.searchDocument) 
      { 
        if(document.documentTitle.toLowerCase().indexOf($scope.searchDocument.toLowerCase()) !== -1 || document.document.shortDescription.toLowerCase().indexOf($scope.searchDocument.toLowerCase()) !== -1) 
       { 
        //returns filtered object 
        return document 
       } 
      }else { 
       return document; 
      } 
     } 

Trường hợp $ scope.searchDocument là biến phạm vi được liên kết với hộp văn bản tìm kiếm (thẻ đầu vào HTML), trong đó người dùng có thể nhập văn bản để tìm kiếm.

+0

Tôi thấy câu trả lời này rất khó hiểu. Nó trả lời câu hỏi như thế nào? –

+0

Dear Sir (@Jason Swett), Khi chúng ta có mảng đối tượng và đối tượng đó có thuộc tính đối tượng khác trong nó, ví dụ tài liệu "tài liệu" của đối tượng mảng thì chúng ta cần tạo bộ lọc tùy chỉnh trong bộ điều khiển để thực hiện "tìm kiếm" như chức năng. –

2

Nếu bạn đang lọc nhiều thuộc tính thì cú pháp sẽ giống như dưới đây.

<ul> 
    <li ng-repeat="item in list | {filter: top_object_property_name: value, top_object_property_with_nested_objects_name: {nested_object_property_name: value}}"> 
     ... 
    </li> 
</ul> 

ví dụ:

 var employees = [name: 'John', roles: [{roleName: 'Manager'},{roleName: 'Supervisor'}]]; 

     <li ng-repeat="staff in employees | {filter: name: 'John', roles: {roleName: 'Manager'}}"> 
       ... 
     </li> 
Các vấn đề liên quan