2012-08-01 19 views
96

Ist es möglich, ein Argument an die Filterfunktion zu übergeben, damit Sie nach einem beliebigen Namen filtern können?Argumente an angularjs Filter übergeben

So etwas wie

$scope.weDontLike = function(item, name) { 
    console.log(arguments); 
    return item.name != name; 
}; 

Antwort

209

Eigentlich gibt eine andere ist (vielleicht bessere Lösung), wo man die Winkel des verwenden können nativen ‚Filter‘ Filter und noch Argumente übergeben zu Ihrer benutzerdefinierte Filter.

den folgenden Code vor:

<div ng-repeat="group in groups"> 
    <li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)"> 
     <span>{{friend.name}}</span> 
    <li> 
</div> 

Um diese Arbeit zu machen Sie einfach Ihre Filter wie folgt definieren:

$scope.weDontLike = function(name) { 
    return function(friend) { 
     return friend.name != name; 
    } 
} 

Wie man hier sehen kann, weDontLike gibt tatsächlich eine andere Funktion, die hat Ihr Parameter in seinem Umfang sowie das ursprüngliche Element, das vom Filter kommt.

Es hat mich 2 Tage gekostet zu realisieren, dass Sie das tun können, habe diese Lösung noch nirgendwo gesehen.

Checkout Reverse polarity of an angular.js filter um zu sehen, wie Sie dies für andere nützliche Operationen mit Filter verwenden können.

+13

Dies sollte eigentlich akzeptiert werden, es ist eine bessere und funktionierende Lösung für die OP-Frage. Netter Denis! – ChrisR

+0

Falls Ihr Filter mehrere Argumente benötigt, lesen Sie [Wie rufe ich einen Angular.js-Filter mit mehreren Argumenten auf?] (Http://stackoverflow.com/questions/16227325/how-do-i-call-an-angular-) js-filter-with-multiple-arguments) – nh2

+0

Einverstanden, dies sollte die gewählte Lösung sein. sehr elegant! – JSancho

76

Von dem, was ich verstehe Sie nicht eine Argumente an eine Filterfunktion passieren kann (wenn die 'Filter' Filter verwenden). Was würden Sie tun müssen, ist, einen benutzerdefinierten Filter schreiben, etw wie folgt aus:

.filter('weDontLike', function(){ 

return function(items, name){ 

    var arrayToReturn = [];   
    for (var i=0; i<items.length; i++){ 
     if (items[i].name != name) { 
      arrayToReturn.push(items[i]); 
     } 
    } 

    return arrayToReturn; 
}; 

Hier ist die Arbeits jsFiddle ist: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/

Die andere einfache Alternative, ohne benutzerdefinierte Filter schreiben ist, einen Namen zu speichern, herauszufiltern, in einem Umfang und dann schreiben:

$scope.weDontLike = function(item) { 
    return item.name != $scope.name; 
}; 
+0

Das ist Präfekt danke! Speichern des Namens im Bereich wird nicht so gut funktionieren, da ich drei Listen aus den gleichen Daten auf der gleichen Seite im Filter mit verschiedenen Zuständen (oder Namen) habe. – shapeshifter

+0

beliebig, um 'Adam' (bezogen auf Ihren JSFiddle) dynamisch zu setzen? es scheint unmöglich (und ich denke, das ist absichtlich) ngModel und einen benutzerdefinierten Filter in Angular zu kombinieren ... – Rolf

+0

Ist es möglich, die Parameter eines Filters neu zu ordnen? Übergeben Sie das Element beispielsweise an den zweiten Parameter eines Filters? – Pooya

61

Eigentlich Sie einen Parameter übergeben können (http://docs.angularjs.org/api/ng.filter:filter) und keine benutzerdefinierte Funktion nur für diese benötigen. Wenn Sie Ihre HTML umschreiben, wie unten es funktionieren:

<div ng:app> 
<div ng-controller="HelloCntl"> 
<ul> 
    <li ng-repeat="friend in friends | filter:{name:'!Adam'}"> 
     <span>{{friend.name}}</span> 
     <span>{{friend.phone}}</span> 
    </li> 
</ul> 
</div> 
</div> 

http://jsfiddle.net/ZfGx4/59/

+8

Ja. Randnotiz - wenn jemand '! Adam' heißt, erhält man ihn wie {Name: '!! Adam'}. – honzajde

+5

Sie können auch Arrays auch hier übergeben wie 'Filter: [' Adam ',' John '] ' – iConnor

+6

Jsfiddle Link ist kaputt. – Seregwethrin

2

Erweiterung auf pkozlowski.opensource's answer und mit Hilfe von Javascript array's builtin Filtermethode eine prettified Lösung dieser sein könnte:

.filter('weDontLike', function(){ 
    return function(items, name){ 
     return items.filter(function(item) { 
      return item.name != name; 
     }); 
    }; 
}); 

Hier ist die jsfiddle link.

Mehr über Array-Filter here.

23

können Sie einfach tun wie diese In Template

<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span> 

In Filter

angular.module("app") 
.filter("firstFiler",function(){ 

    console.log("filter loads"); 
    return function(items, firstArgument,secondArgument){ 
     console.log("item is ",items); // it is value upon which you have to filter 
     console.log("firstArgument is ",firstArgument); 
     console.log("secondArgument ",secondArgument); 

     return "hello"; 
    } 
    }); 
+1

Einfach und einfach! –

+1

Ich mag diesen Ansatz besser als die anderen Techniken. – Greg

+1

Dies ist die richtige Lösung. – Cam

0

Sie mehrere Argumente Winkel Filter passieren kann!

definieren meine Winkel App und und eine App-Ebene variabel -

var app = angular.module('filterApp',[]); 
app.value('test_obj', {'TEST' : 'test be check se'}); 

Ihre Filter werden wie: -

app.filter('testFilter', [ 'test_obj', function(test_obj) { 
    function test_filter_function(key, dynamic_data) { 
     if(dynamic_data){ 
     var temp = test_obj[key]; 
     for(var property in dynamic_data){ 
      temp = temp.replace(property, dynamic_data[property]); 
     } 
     return temp; 
     } 
     else{ 
     return test_obj[key] || key; 
     } 

    } 
    test_filter_function.$stateful = true; 
    return test_filter_function; 
    }]); 

Und von HTML finden Sie Daten wie senden: -

<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span> 

Hier sende ich ein JSON-Objekt an den Filter. Sie können auch beliebige Daten wie String oder Zahl senden.

können Sie auch dynamische Anzahl von Argumenten übergeben zu filtern, in diesem Fall, dass Sie Argumente verwenden, um diese Argumente zu bekommen.

Für eine funktionierende Demo gehen Sie hier - passing multiple arguments to angular filter

Verwandte Themen