61

我正在尝试过滤 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>

有没有一种基于已注册和!已注册的过滤的好方法。

4

5 回答 5

120

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

于 2013-07-15T14:40:30.767 回答
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>
于 2013-07-15T14:11:03.117 回答
6

如果项目没有设置布尔属性,您可以使用“!”找到属性未设置为 true 的项目 带引号。前过滤器:{属性:'!'+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>
于 2017-08-02T07:53:38.973 回答
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;
    };
}])

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

于 2013-11-13T13:55:08.457 回答
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>
于 2015-12-17T17:38:36.410 回答