99 votes

Passer des arguments aux filtres angularjs

J'ai trouvé un exemple avec jsfiddle sur l'utilisation des filtres avec angularjs.

http://jsfiddle.net/ZfGx4/3/

Est-il possible de passer un argument à la fonction de filtrage pour pouvoir filtrer par n'importe quel nom?

Quelque chose comme

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

226voto

Denis Pshenov Points 1300

En fait il y a une autre (peut-être une meilleure solution) où vous pouvez utiliser l'angle de natif de "filtre" filtre et encore passer des arguments à votre filtre personnalisé.

Considérons 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 ce faire, il suffit de définir 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 son champ d'application ainsi que l'élément d'origine provenant du filtre.

Il m'a fallu 2 jours pour réaliser que vous pouvez faire cela, n'ai pas vu cette solution partout.

La caisse d'Inverser la polarité d'un angular.js filtre pour voir comment vous pouvez l'utiliser pour d'autres opérations avec filtre.

76voto

pkozlowski.opensource Points 52557

À partir de ce que je comprends, vous ne pouvez pas passer un les arguments d'une fonction de filtre (lors de l'utilisation de "filtre" filtre). Ce que vous avez à faire est d'écrire un filtre personnalisé, qqch 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;
};

Ici, c'est le travail jsFiddle: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/

L'autre alternative simple, sans avoir à écrire des filtres personnalisés est de stocker un nom de filtre dans un champ, puis d'écrire:

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

61voto

mikel Points 10793

En fait, vous pouvez passer un paramètre ( http://docs.angularjs.org/api/ng.filter:filter ) sans nécessiter de fonction personnalisée. Si vous réécrivez votre code 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>
 

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X