58 votes

AngularJS - Injection de dépendances dans les services, les fabriques, les filtres, etc.

Donc j'ai des plugins et des bibliothèques que je veux utiliser dans mon application angular et (actuellement) je fais simplement référence à ces fonctions/méthodes telles qu'elles sont prévues dans 99% des applications, d'une manière qui ignore complètement l'injection de dépendance.

J'ai (par exemple) la bibliothèque javascript "MomentJS" qui gère le formatage et la validation des dates et j'en ai besoin dans toute mon application dans des contrôleurs, des services et des filtres. La manière dont j'ai appris (en utilisant AngularJS) est de créer un service qui fait référence à la fonction (et à ses méthodes) et d'injecter ce service dans mes contrôleurs, ce qui fonctionne très bien.

Le problème c'est que j'ai vraiment besoin de faire référence à cette bibliothèque dans tous les types de composants différents, des services aux filtres en passant par les contrôleurs et tout le reste. Alors, je suppose que ma question est comment faites-vous l'injection de dépendance dans les filtres, les services et tout le reste qui n'est pas un contrôleur?

Est-ce possible? Est-ce même bénéfique?

Toute aide serait grandement appréciée :)

102voto

Arun P Johny Points 151748

Oui, vous pouvez utiliser l'injection de dépendance pour les filtres et les directives

Ex :

Filtre :

app.filter('', ['$http', function(http){
    return function(data){
    }
}]);

Directive :

app.directive('', ['$http', function(http){
    return {
        ....
    }
}]);

Service :

app.factory('', ['$http', function(http) {
  var shinyNewServiceInstance;
  return shinyNewServiceInstance;
}]);

1 votes

Y a-t-il un moyen de tordre la syntaxe pour injecter des dépendances dans un fournisseur? J'ai besoin soit: un fournisseur dans lequel je peux injecter des dépendances, soit une usine/service dans lequel je peux injecter dans un bloc de configuration(?)

0 votes

@Cody Services et factories sont des fournisseurs. De plus, .config() gère l'injection de dépendance exactement de la même manière que les exemples ci-dessus.

0 votes

@KevinBeal donc pour toute méthode de module, (c'est-à-dire config, run, controller`, etc), vous passez un tableau avec les dépendances et une fonction de gestionnaire, et les dépendances seront ensuite injectées dans la fonction de gestionnaire. Ai-je raison? Merci!

21voto

user1338062 Points 1553

Pour des raisons de complétude, voici un exemple de service avec injection :

app.service('', ['$http', function($http) {
  this.foo = function() { ... }
}]);

0 votes

Au moment où j'écris ceci, il semble impossible d'injecter un contrôleur dans un service - du moins pas mon propre contrôleur personnalisé. Je ne devrais vraiment pas être ici mais je ne vois pas de moyen de faire fonctionner une directive modale qui se trouve en dehors du contrôleur qui la déclenche. J'ai créé un service pour essayer de communiquer dans les deux sens en pensant que le service pourrait injecter les deux contrôleurs mais hélas... quelle serait la meilleure façon d'y parvenir. J'aimerais poser des questions ici mais cela semble bloqué pour une raison quelconque, je ne peux donc que commenter des choses similaires.

1 votes

Vous devez vraiment poser une question, de préférence avec un plnkr.co de votre code.

0 votes

Je serais ravi de pouvoir écrire des questions - il semble que sur ce site, une fois que vous êtes bloqué pour en poser trop, vous êtes bloqué pour toujours. En bref, je pense que vous ne pouvez pas injecter de contrôleurs dans les choses (ce qui semble juste absurde de toute façon). J'ai donc créé un service avec un getter-setter et surveille ensuite les changements dans les contrôleurs qui ont besoin de s'abonner aux mises à jour. Cela a fonctionné et permet à mes contrôleurs de communiquer entre eux.

7voto

Daniel Points 3236

Alors que les réponses déjà existantes sont correctes et fonctionnent, le guide de style angulaire de john papas favorise l'utilisation du service $inject dans Y091 :

Filtre :

app.filter('', MyFilter);
MyFilter.$inject = ['$http'];
function MyFilter() {
  return function(data) {
  }
}

Directive :

app.directive('', MyDirective);
MyDirective.$inject = ['$http'];
function MyDirective() {
  return {
    ...
  }
}

Usine :

app.factory('', MyFactory);
MyFactory.$inject = ['$http'];
function MyFactory() {
  var shinyNewServiceInstance;
  return shinyNewServiceInstance;
}

Service :

app.service('', MyService);
MyService.$inject = ['$http'];
function MyService() {
  this.foo = foo;
  function foo(){
    ...
  }
}

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