Est-il possible de passer un argument à la fonction de filtrage afin de pouvoir filtrer par n'importe quel nom?
Quelque chose comme
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Est-il possible de passer un argument à la fonction de filtrage afin de pouvoir filtrer par n'importe quel nom?
Quelque chose comme
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Réponses:
En fait, il existe une autre solution (peut-être meilleure) où vous pouvez utiliser le filtre natif de `` filtre '' angulaire et toujours transmettre des arguments à votre filtre personnalisé.
Considérez le code suivant:
<div ng-repeat="group in groups">
<li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
<span>{{friend.name}}</span>
<li>
</div>
Pour que cela fonctionne, définissez simplement votre filtre comme suit:
$scope.weDontLike = function(name) {
return function(friend) {
return friend.name != name;
}
}
Comme vous pouvez le voir ici, weDontLike renvoie en fait une autre fonction qui a votre paramètre dans sa portée ainsi que l'élément d'origine provenant du filtre.
Il m'a fallu 2 jours pour réaliser que vous pouvez le faire, je n'ai encore vu cette solution nulle part.
Checkout Inverser la polarité d'un filtre angular.js pour voir comment vous pouvez l'utiliser pour d'autres opérations utiles avec le filtre.
D'après ce que je comprends, vous ne pouvez pas passer d'arguments à une fonction de filtre (lorsque vous utilisez le filtre «filtre»). Ce que vous auriez à faire est d'écrire un filtre personnalisé, qc comme ceci:
.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;
};
Voici le jsFiddle fonctionnel: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/
L'autre alternative simple, sans écrire de filtres personnalisés, consiste à stocker un nom à filtrer dans une portée, puis à écrire:
$scope.weDontLike = function(item) {
return item.name != $scope.name;
};
En fait, vous pouvez passer un paramètre ( http://docs.angularjs.org/api/ng.filter:filter ) et vous n'avez pas besoin d'une fonction personnalisée juste pour cela. Si vous réécrivez votre HTML comme ci-dessous, cela fonctionnera:
<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']
Vous pouvez simplement faire comme ceci dans le modèle
<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>
Dans le filtre
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";
}
});
En étendant la réponse de pkozlowski.opensource et en utilisant la array's
méthode de filtre intégré javascript , une solution précieuse pourrait être la suivante:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
Voici le lien jsfiddle .
Plus d'informations sur le filtre Array ici .
Vous pouvez passer plusieurs arguments au filtre angulaire!
Définition de mon application angulaire et d'une variable au niveau de l'application -
var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});
Votre filtre sera comme: -
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;
}]);
Et à partir du HTML, vous enverrez des données telles que: -
<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>
Ici, j'envoie un objet JSON au filtre. Vous pouvez également envoyer tout type de données comme une chaîne ou un nombre.
vous pouvez également passer un nombre dynamique d'arguments à filtrer, dans ce cas, vous devez utiliser des arguments pour obtenir ces arguments.
Pour une démonstration fonctionnelle, allez ici - en passant plusieurs arguments au filtre angulaire
Vous pouvez simplement utiliser | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
Et en js
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}