2013-07-15 43 views
54

我正在尝试在ng-repeat中对布尔值进行过滤。布尔型ng-repeat过滤器

未注册用户的列表:

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

注册用户的列表:

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

有没有好的办法来筛选基于注册和注册!

回答

108

滤波器由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

当我在AngularJS 1.2中试用这个时,如果我引用它,false表达式只能正确计算:filter:{registered:'false'} – karlgold

+0

看起来不起作用现在在1.2.2(串或不),任何人都可以确认?编辑:没关系,我的问题是在对象迭代过滤器 – Guillaume86

+1

对于嵌套对象的语法从1.2更改为1.3,看到这个答案http://stackoverflow.com/a/28160037/595152 –

13

在控制器中创建一个方法,该方法根据您需要的逻辑返回true或false,并在过滤器中指定该函数。

像这样:

$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

凡'item'应该从来吗? –

+0

@ZJRollyson item是过滤器方法'idRegirstered(item)'的参数。过滤通过将'user'对象传递给过滤器方法并评估布尔返回值来工作。 – Daniel

+2

不可能转换过滤方法。你必须像这样在filter过滤器中进行反转:'$ scope.isUnregistered = function(item){return!item.registered; };'并像这样使用'filter:isUnregistered' – awe

3

有同样的问题。 Alfrescian解决方案在Angular 1.1.5上不适用于我。

发现这个小提琴: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; 
    }; 
}]) 

您需要根据您的字段调整过滤器的代码。

1

轻微修改Websirnik的答案,这允许任何列名的数据集:

标记:

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

好的电话Juzzz,谢谢。 –

5

如果一个项目没有一个布尔属性设置,你可以找到通过使用'!'属性没有设置为true的项目用引号。 e.x.过滤器:{property:'!'+ true}。

例子:

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

为了让未注册的用户过滤器:

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