2013-07-15 29 views
54

Tôi đang cố gắng lọc trên giá trị boolean trong một ng-lặp lại.bộ lọc ng-lặp lại trên boolean

Danh sách người dùng đăng ký:

<h3>Unregistered Users</h3> 
    <div ng-repeat="user in users | filter:!user.registered"> 
     <div class="row-fluid"> 
     <div class="span2"> 
      {{user.name}} 
     </div> 
     </div> 
    </div> 

Danh sách người dùng đã đăng ký:

<h3>Registered Users</h3> 
    <div ng-repeat="user in users | filter:user.registered"> 
     <div class="row-fluid"> 
     <div class="span2"> 
      {{user.name}} 
     </div> 
     </div> 
    </div> 

Có cách nào tốt để lọc dựa trên đăng ký và đăng ký!.

Trả lời

108

lọc theo biểu obj:

<h3>Unregistered Users</h3> 
<div ng-repeat="user in users | filter:{registered:false}"> 
    <div class="row-fluid"> 
    <div class="span2"> 
     {{user.name}} 
    </div> 
    </div> 
</div> 

JSFiddle: http://jsfiddle.net/alfrescian/9ytDN/

+23

Khi tôi thử điều này với AngularJS 1.2, biểu thức sai chỉ đánh giá chính xác nếu tôi trích dẫn nó: filter: {registered: 'false'} – karlgold

+0

Dường như nó không hoạt động ở tất cả bây giờ trong 1.2.2 (đã được xâu chuỗi hay không), ai cũng có thể xác nhận? EDIT: nevermind, vấn đề của tôi là trong bộ lọc đối tượng iteration – Guillaume86

+1

Đối với các đối tượng lồng nhau cú pháp thay đổi từ 1,2 đến 1,3, xem câu trả lời này http://stackoverflow.com/a/28160037/595152 –

13

Tạo phương thức trong bộ điều khiển trả về true hoặc false dựa trên logic bạn cần và chỉ định hàm đó trong bộ lọc.

Something như thế này:

$scope.isRegistered = function(item) { 
    return item.registered; 
}; 

<h3>Unregistered Users</h3> 
<div ng-repeat="user in users | filter:!isRegistered "> 
    <div class="row-fluid"> 
    <div class="span2"> 
     {{user.name}} 
    </div> 
    </div> 
</div> 
+0

đâu là 'item' nghĩa vụ phải được đến từ đâu? –

+0

@ZJRollyson item là đối số của phương thức lọc 'idRegirstered (item)'. Lọc các công trình bằng cách chuyển đối tượng 'user' đến phương thức lọc và đánh giá giá trị trả về boolean. – Daniel

+2

Không thể đảo ngược phương pháp lọc. Bạn phải thực hiện đảo ngược bên trong phương thức lọc như sau: '$ scope.isUnregistered = function (item) {return! Item.registered; }; 'và sử dụng nó như thế này' filter: isUnregistered' – awe

3

Đã cùng một câu hỏi. Giải pháp Alfrescian đã không làm việc cho tôi trên Angular 1.1.5.

Tìm thấy fiddle này: http://jsfiddle.net/buehler/HCjrQ/

.filter('onlyBooleanValueFilter', [function(){ 
    return function(input, param){ 
     var ret = []; 
     if(!angular.isDefined(param)) param = true; 
     angular.forEach(input, function(v){ 
      // 'active' is a hard-coded field name 
      if(angular.isDefined(v.active) && v.active === param){ 
       ret.push(v); 
      } 
     }); 
     return ret; 
    }; 
}]) 

Bạn sẽ cần phải điều chỉnh mã của bộ lọc theo lĩnh vực của bạn.

1

sửa đổi nhẹ vào câu trả lời Websirnik, điều này cho phép bất kỳ tên cột cho các tập dữ liệu:

Markup:

<div repeat="row in your.dataset | onlyBooleanValueFilter: 'yourColumn' : true"> 
    ...your stuff here.... 
</div> 
+0

Tốt gọi Juzzz, cảm ơn. –

5

Trong trường hợp một mục không có một bộ tài sản boolean, bạn có thể tìm thấy mục có thuộc tính không được đặt thành true bằng cách sử dụng '!' với dấu ngoặc kép. e.x. bộ lọc: {property: '!' + true}.

Ví dụ:

$scope.users = [ 
     { 
      name : 'user1 (registered)', 
      registered : true 
     }, 
     { 
      name : 'user2 (unregistered)' 
     }, 
     { 
      name : 'user3 (registered)', 
      registered : true 
     }, 
     { 
      name : 'user4 (unregistered)' 
     } 

Để có được đăng ký sử dụng bộ lọc:

<h3>Unregistered Users</h3> 
<div ng-repeat="user in users | filter:{registered:'!'+true}"> 
    <div class="row-fluid"> 
     <div class="span2"> 
      {{user.name}} 
     </div> 
     </div> 
    </div> 
Các vấn đề liên quan