2013-07-15 14 views
54

Próbuję filtrować wartość boolowską w powtórzeniu ng.ng-repeat filter on boolean

Lista niezarejestrowanych użytkowników:

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

Lista zarejestrowanych użytkowników:

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

Czy jest to dobry sposób, aby filtrować na podstawie zarejestrowanych i zarejestrowany!.

Odpowiedz

108

filtr przez ekspresję 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

Kiedy próbuję tego z AngularJS 1.2, fałszywe wyrażenie tylko poprawnie ocenia, jeśli cytuję: filter: {registered: 'false'} – karlgold

+0

Wygląda na to, że to nie działa w ogóle teraz w 1.2.2 (usztywnione czy nie), każdy może potwierdzić? EDYCJA: nevermind, mój problem jest w filtrze na iteracji obiektu – Guillaume86

+1

Dla obiektów zagnieżdżonych zmieniono składnię z 1.2 na 1.3, zobacz tę odpowiedź http://stackoverflow.com/a/28160037/595152 –

13

Utwórz metodę w kontrolerze, która zwraca wartość true lub false w zależności od potrzebnej logiki i określ tę funkcję w filtrze.

coś takiego:

$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

Gdzie jest 'item' ma być pochodzących z? –

+0

Pozycja @ZJRollyson jest argumentem metody filtru "idRegirstered (element)'. Filtrowanie działa, przekazując obiekt 'user' do metody filtru i oceniając wartość zwracaną przez boolowską. – Daniel

+2

Nie można odwrócić metody filtra. Musisz wykonać odwracanie wewnątrz metody filtrującej w następujący sposób: '$ scope.isUnregistered = function (item) {return! Item.registered; }; 'i użyj go w ten sposób' filter: isUnregistered' – awe

3

Gdyby to samo pytanie. Rozwiązanie Alfrescianu nie działało dla mnie w Angular 1.1.5.

Znaleźliśmy ten skrzypce: 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; 
    }; 
}]) 

trzeba by ustawić kod filtra według swojej dziedzinie.

1

Niewielkie modyfikacje odpowiedź Websirnik, ten pozwala na dowolną nazwę kolumny w zbiorze:

Markup:

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

Dobre połączenie Juzzz, dzięki. –

5

W przypadku, gdy przedmiot nie posiada logiczną zestaw właściwości można znaleźć element z właściwością nie ustawioną na true za pomocą "!" z cytatami. dawny. filter: {property: '!' + true}.

Przykład:

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

Aby przeglądać komentarzy filtr:

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