2013-07-15 5 views
54

Я пытаюсь отфильтровать булево значение в ng-repeat.ng-repeat filter on boolean

Список незарегистрированных пользователей:

<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, ложное выражение оценивается правильно, если я его цитирую: filter: {registered: 'false'} – karlgold

+0

Похоже, что это не работает совсем не сейчас в 1.2.2 (стриг или нет), кто-нибудь может подтвердить? EDIT: nevermind, моя проблема в фильтре на итерации объекта – 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' методу фильтра и оценивая возвращаемое значение boolean. – Daniel

+2

Невозможно инвертировать метод фильтрации. Вы должны сделать инвертирование внутри метода фильтра следующим образом: '$ 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, это позволяет любое имя столбца для набора данных:

Markup:

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

Хороший звонок Juzzz, спасибо. –

5

В случае, если элемент не имеет булево набор свойств, вы можете найти элемент с атрибутом свойства, не установленным в 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>