2014-01-28 3 views
19

Wie mehrere Werte filtern (ODER-Operation) in AngularJS mit AnkreuzleisteWie mehrere Werte filtern (ODER-Operation) in AngularJS mit Ankreuzfeld

<ul ng-repeat="movie in movies |filter:Filter.Comedy | filter:Filter.Action | filter:Filter.Drama"> 
    <li>{{movie.name}}</li> 
</ul> 
<label>Comedy</label><input type="checkbox" ng-model="Filter.Comedy" ng-true-value="Comedy" data-ng-false-value=''/><br/> 
<label>Action</label><input type="checkbox" ng-model="Filter.Action" ng-true-value="Action" data-ng-false-value=''/><br/> 
<label>Drama</label><input type="checkbox" ng-model="Filter.Drama" ng-true-value="Drama" data-ng-false-value=''/> 

http://jsfiddle.net/samibel/va2bE/1/

+0

Großartige Arbeit zur Klärung der Operation. Ich habe überall nach so etwas gesucht. –

Antwort

33

Verwenden einer Funktion Filter:

Ausblick:

<ul ng-repeat="movie in movies | filter: showMovie"> 
    <li>{{movie.name}}</li> 
</ul> 

Controller:

$scope.showMovie = function(movie){ 
    return movie.genre === $scope.Filter.Comedy || 
     movie.genre === $scope.Filter.Drama || 
     movie.genre === $scope.Filter.Action; 
}; 

Fiddle

+0

thx Gruff Bunny – samibel

+3

Dies funktioniert nicht. –

+0

@AdamArold können Sie bitte erklären, wo Sie denken, dass es nicht funktioniert - haben Sie eine Geige hinzugefügt, die es funktioniert zeigt? –

0

Ich habe die Lösung:

http://jsfiddle.net/samibel/va2bE/17/

app.filter('searchFilter',function($filter) { 
     return function(items,searchfilter) { 
      var isSearchFilterEmpty = true; 
      //searchfilter darf nicht leer sein 
       angular.forEach(searchfilter, function(searchstring) { 
        if(searchstring !=null && searchstring !=""){ 
         isSearchFilterEmpty= false; 
        } 
       }); 

     if(!isSearchFilterEmpty){ 
       var result = []; 

       angular.forEach(items, function(item) { 
        var isFound = false; 
        angular.forEach(item, function(term,key) {       
         if(term != null && !isFound){ 
          term = term.toLowerCase(); 
           angular.forEach(searchfilter, function(searchstring) {  
            searchstring = searchstring.toLowerCase(); 
            if(searchstring !="" && term.indexOf(searchstring) !=-1 && !isFound){ 
             result.push(item); 
             isFound = true; 
             // console.log(key,term); 
            } 
           }); 
         } 
          }); 
         }); 
      return result; 
     }else{ 
     return items; 
     } 
    } 
    } 
+0

Der Code bricht in der Zeile, die den Term-Wert aktualisiert. Term ist nicht definiert. Würde mich freuen, diese Arbeit zu sehen! Ich brauche einen benutzerdefinierten Filter, da ich mir ziemlich sicher bin, dass es eine Filter-Überschreibung für meine Standard-'filter:' -Funktion gibt. – SinSync

5

ich etwas ähnliches wie dies in der Vergangenheit getan haben ..

<ul ng-repeat="movie in ((movies | filter:Filter.Comedy) + (movies | filter:Filter.Action) + (movies | filter:Filter.Drama))"> 
    <li>{{movie.name}}</li> 
</ul> 
+4

Diese Lösung ist völlig in Ordnung, solange Genres exklusiv zugeordnet sind. Andernfalls könnten Sie doppelte Einträge eines Films erhalten. – Daniel

+0

Ich habe unter dieser Annahme operiert, da das der Fall war. – jKlaus

5
$filter('filter')(data,{type:'x'} && {type:'y'}) 

Gibt Ihnen alle Elemente, die vom Typ x ODER des Typs y sind.

+1

super intuitiv! : D – mccc

+0

Das war genau ich suchte nach – Aruna

+1

Ist Angular gonna RegEx dies ??? Sieht wie ein Kurzschluss zu "type: 'y'" aus. – Cody

Verwandte Themen