2012-12-12 65 views
7

Tôi có đối tượng người dùng được định nghĩa như bên dưới.Làm cách nào để áp dụng bộ lọc trên nhiều đối tượng bằng AngularJS?

$scope.users = [{id: 1, name: 'Adam', friends: [{name: 'John', age: 21, sex: 'M'}, {name: 'Brad', age: 32, sex: 'M'}]}] 

Sau đó, tôi đã đoạn mã sau:

<div ng-repeat="user in users> 
<input type="text" ng-model="searchText"> 
<div ng-repeat="friend in user.friends | filter:searchText"> 
    {{user.name}} {{friend.name}} {{friend.age}} 
</div> 
</div> 

Bây giờ khi tôi gõ vào hộp văn bản: 'searchText', tôi muốn các bộ lọc để hiển thị tên của người sử dụng và tên/tuổi của bạn. Bất cứ ai có thể giúp tôi làm thế nào để làm điều này?

Nếu tôi đúng, tôi nghĩ rằng tôi cần tạo bộ lọc tùy chỉnh cho điều này hoặc có cách nào khác để tôi có thể thực hiện việc này không?

Trả lời

14

Bởi vì bạn muốn lọc vào hai điều cùng một lúc - một số tính chất của mảng bạn bè và cũng là người sử dụng - bạn sẽ cần phải tạo riêng của bạn custom filter chấp nhận 2 tham số bổ sung :

myApp.filter('myFilter', function() { 
    return function(friends, searchText, username) { 
    var searchRegx = new RegExp(searchText, "i"); 
    if ((searchText == undefined) || (username.search(searchRegx) != -1)) { 
     return friends; 
    } 
    var result = []; 
    for(i = 0; i < friends.length; i++) { 
     if (friends[i].name.search(searchRegx) != -1 || 
      friends[i].age.toString().search(searchText) != -1) { 
      result.push(friends[i]); 
     } 
    } 
    return result; 
    } 
}); 

Sau đó gọi nó như vậy:

<div ng-repeat="user in users"> 
    <input type="text" ng-model="searchText"> 
    <div ng-repeat="friend in user.friends | myFilter:searchText:user.name"> 
     {{user.name}} {{friend.name}} {{friend.age}} 
    </div> 
</div> 

": searchText: user.name" là cách bạn chuyển đối số bổ sung vào bộ lọc tùy chỉnh.

Fiddle.

+0

Cảm ơn rất nhiều Mark! Nhưng filterFilter này (bạn bè, searchText) sẽ lọc trên tất cả các đối tượng của bạn bè, tên, tuổi và giới tính hoặc chỉ khác tên và tuổi. Yêu cầu của tôi là tôi chỉ muốn 'tên' và 'tuổi' để có thể tìm kiếm được và kết quả chỉ được lọc trên hai đối tượng của bạn bè, vì đó là những trường được hiển thị chứ không phải 'sex' –

+0

Xem câu trả lời cập nhật. –

+0

Tôi nhận ra đây là bao nhiêu ... nhưng điều gì có thể xảy ra khi 'searchText' của đầu vào của tôi luôn luôn được xác định bên trong bộ lọc? Vấn đề phạm vi, rõ ràng, nhưng tại sao? – Clev3r

1

http://docs.angularjs.org/api/ng.filter:filter

<div ng-repeat="user in users> 
<input type="text" ng-model="search.$"> 
<div ng-repeat="friend in user.friends | filter:search"> 
    {{user.name}} {{friend.name}} {{friend.age}} 
</div> 
</div> 
+1

Cảm ơn fastreload! Điều này có ích! Nhưng đối tượng này sẽ lọc là gì? Bộ lọc này chỉ có trên tên người dùng ** và ** của người dùng ** không **? –

+0

Như được mô tả trong tài liệu, nó sẽ tìm kiếm tất cả các thuộc tính của một đối tượng bên trong một mảng các đối tượng. Bạn có thể nghĩ về '$' như một ký tự đại diện ma thuật. –

+0

Cảm ơn fastreload! Ở đây trong đối tượng bạn của tôi, tôi có ba thuộc tính: tên, tuổi và giới tính. Nhưng tôi không muốn tình dục có thể tìm kiếm được. Có cách nào tôi có thể đạt được điều này? –

Các vấn đề liên quan