Ist es möglich, ein Argument an die Filterfunktion zu übergeben, damit Sie nach einem beliebigen Namen filtern können?
Etwas wie
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Ist es möglich, ein Argument an die Filterfunktion zu übergeben, damit Sie nach einem beliebigen Namen filtern können?
Etwas wie
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Antworten:
Tatsächlich gibt es eine andere (möglicherweise bessere) Lösung, bei der Sie den nativen Filterfilter des Winkels verwenden und trotzdem Argumente an Ihren benutzerdefinierten Filter übergeben können.
Betrachten Sie den folgenden Code:
<div ng-repeat="group in groups">
<li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
<span>{{friend.name}}</span>
<li>
</div>
Damit dies funktioniert, definieren Sie Ihren Filter einfach wie folgt:
$scope.weDontLike = function(name) {
return function(friend) {
return friend.name != name;
}
}
Wie Sie hier sehen können, gibt weDontLike tatsächlich eine andere Funktion zurück, deren Gültigkeitsbereich Ihren Parameter sowie das ursprüngliche Element aus dem Filter enthält.
Ich habe 2 Tage gebraucht, um zu erkennen, dass Sie dies tun können. Ich habe diese Lösung noch nirgendwo gesehen.
Checkout Verpolung eines Angular.js-Filters umkehren, um zu sehen, wie Sie dies für andere nützliche Operationen mit Filter verwenden können.
Soweit ich weiß, können Sie keine Argumente an eine Filterfunktion übergeben (wenn Sie den Filterfilter verwenden). Was Sie tun müssten, ist einen benutzerdefinierten Filter zu schreiben, etw wie folgt:
.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 funktionierende jsFiddle: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/
Die andere einfache Alternative, ohne benutzerdefinierte Filter zu schreiben, besteht darin, einen Namen zum Herausfiltern in einem Bereich zu speichern und dann zu schreiben:
$scope.weDontLike = function(item) {
return item.name != $scope.name;
};
Tatsächlich können Sie einen Parameter übergeben ( http://docs.angularjs.org/api/ng.filter:filter ) und benötigen dafür keine benutzerdefinierte Funktion. Wenn Sie Ihren HTML-Code wie folgt umschreiben, funktioniert dies:
<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>
filter:['Adam', 'john']
Sie können dies einfach in Vorlage tun
<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>
Im 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";
}
});
Wenn Sie die Antwort von pkozlowski.opensource erweitern und die in Javascript array's
integrierte Filtermethode verwenden, könnte dies eine hübsche Lösung sein:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
Hier ist der jsfiddle Link .
Mehr zum Array-Filter hier .
Sie können mehrere Argumente an den Winkelfilter übergeben!
Definieren meiner eckigen App und einer App-Level-Variablen -
var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});
Ihr Filter sieht wie folgt aus: -
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 aus HTML senden Sie Daten wie: -
<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 Zeichenfolgen oder Zahlen senden.
Sie können auch eine dynamische Anzahl von Argumenten zum Filtern übergeben. In diesem Fall müssen Sie Argumente verwenden , um diese Argumente abzurufen.
Eine funktionierende Demo finden Sie hier. Übergeben Sie mehrere Argumente an den Winkelfilter
Sie können einfach verwenden | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
Und in js
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}