布尔值上的ng-repeat过滤器

时间:2013-07-15 13:48:34

标签: angularjs angularjs-ng-repeat angularjs-filter

我试图在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>

是否有基于已注册和已注册的过滤器的好方法。

5 个答案:

答案 0 :(得分:116)

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

答案 1 :(得分: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>

答案 2 :(得分:6)

如果某个项没有设置布尔属性,则可以使用“!”找到属性未设置为true的项目。带引号。 e.x. filter:{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>

答案 3 :(得分:3)

有同样的问题。在Angular 1.1.5上,Alfrescian解决方案对我不起作用。

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

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

答案 4 :(得分:1)

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

.filter('onlyBooleanValueFilter', [function () {
    return function (input, column, trueOrFalse) {
        var ret = [];

        if (!angular.isDefined(trueOrFalse)) {
            trueOrFalse = false;
        }

        angular.forEach(input, function (v) {
            if (angular.isDefined(v[column]) && v[column] === trueOrFalse) {
                ret.push(v);
            }
        });

        return ret;
    };
}])

标记:

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