658 votes

Comment utiliser un filtre dans un contrôleur?

J'ai écrit une fonction de filtre qui retournera des données basées sur l'argument que vous passez. Je veux la même fonctionnalité dans mon contrôleur. Est-il possible de réutiliser la fonction de filtre dans un contrôleur?

C'est ce que j'ai essayé jusqu'ici:

 function myCtrl($scope,filter1)
{ 
    // i simply used the filter function name, it is not working.
}
 

1058voto

Injecter $ filter sur votre contrôleur

 function myCtrl($scope, $filter)
{
}
 

Ensuite, où que vous vouliez utiliser ce filtre, utilisez-le comme ceci:

 $filter('filtername');
 

Si vous voulez passer des arguments à ce filtre, faites-le en utilisant des parenthèses séparées:

 function myCtrl($scope, $filter)
{
    $filter('filtername')(arg1,arg2);
}
 

255voto

Réponse à @Prashanth est correct, mais il est encore plus facile façon de faire de même. Fondamentalement, au lieu d'injecter de l' $filter dépendance et l'utilisation maladroite de la syntaxe de l'invoquer ($filter('filtername')(arg1,arg2);), on peut injecter de la dépendance: nom du filtre, plus le Filter suffixe.

En prenant exemple sur la question, on pourrait écrire:

function myCtrl($scope, filter1Filter) { 
  filter1Filter(input, arg1);
}

Il convient de noter que vous devez ajouter Filter pour le nom du filtre, peu importe que la convention de nommage de vous abonner à:
toto est référencé en appelant fooFilter
fooFilter est référencé en appelant fooFilterFilter

80voto

aamir sajjad Points 1101

En utilisant l'exemple de code suivant, nous pouvons filtrer le tableau dans le contrôleur angulaire par son nom. ceci est basé sur la description suivante. http://docs.angularjs.org/guide/filter

Plunkr

this.filteredArray = filterFilter (this.array, {name: 'Igor'});

JS:

  angular.module('FilterInControllerModule', []).
    controller('FilterController', ['filterFilter', function(filterFilter) {
      this.array = [
        {name: 'Tobias'},
        {name: 'Jeff'},
        {name: 'Brian'},
        {name: 'Igor'},
        {name: 'James'},
        {name: 'Brad'}
      ];
      this.filteredArray = filterFilter(this.array, {name:'Igor'});
    }]);
 

HTML

 <!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Example - example-example96-production</title>


  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.3/angular.min.js"></script>
  <script src="script.js"></script>



</head>
<body ng-app="FilterInControllerModule">
    <div ng-controller="FilterController as ctrl">
    <div>
      All entries:
      <span ng-repeat="entry in ctrl.array">{{entry.name}} </span>
    </div>
    <div>
      Filter By Name in angular controller
      <span ng-repeat="entry in ctrl.filteredArray">{{entry.name}} </span>
    </div>
  </div>
</body>
</html>
 

12voto

NtSpeed Points 41

J'ai un autre exemple, que j'ai fait pour mon processus:

Je reçois un tableau avec une valeur-Description comme ça

 states = [{
    status: '1',
    desc: '\u2713'
}, {
    status: '2',
    desc: '\u271B'
}]
 

dans mon Filters.js:

 .filter('getState', function () {
    return function (input, states) {
        //console.log(states);
        for (var i = 0; i < states.length; i++) {
            //console.log(states[i]);
            if (states[i].status == input) {
                return states[i].desc;
            }
        }
        return '\u2718';
    };
})
 

Ensuite, un test var (contrôleur):

 function myCtrl($scope, $filter) {
    // ....
    var resp = $filter('getState')('1', states);
    // ....
}
 

6voto

Simple As Could Be Points 3906

Il existe une autre façon d'évaluer les filtres qui reflète la syntaxe des vues. L'invocation est poilue mais vous pourriez construire un raccourci. J'aime que la syntaxe de la chaîne soit identique à ce que vous auriez dans une vue. Ressemble à ça:

 function myCtrl($scope, $interpolate) { 
  $scope.$eval($interpolate( "{{ myvar * 10 | currency }} dollars." ))
}
 

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