L'essentiel est:
- Vous NE POUVEZ PAS injecter un service dans la section de configuration du fournisseur .
- Vous POUVEZ injecter un service dans la section qui initialise le service du fournisseur .
Détails:
Le framework angulaire a un processus d'initialisation en 2 phases:
PHASE 1: Config
Pendant la config
phase, tous les fournisseurs sont initialisés et toutes les config
sections sont exécutées. Les config
sections peuvent contenir du code qui configure les objets fournisseur et par conséquent, elles peuvent être injectées avec des objets fournisseur. Cependant, comme les fournisseurs sont les usines des objets de service et à ce stade, les fournisseurs ne sont pas entièrement initialisés / configurés -> vous ne pouvez pas demander au fournisseur de créer un service pour vous à ce stade -> à l'étape de configuration, vous ne pouvez pas utiliser / injecter des services . Lorsque cette phase est terminée, tous les fournisseurs sont prêts (aucune autre configuration de fournisseur ne peut être effectuée une fois la phase de configuration terminée).
PHASE 2: Courir
Pendant la run
phase, toutes les run
sections sont exécutées. À ce stade, les fournisseurs sont prêts et peuvent créer des services -> pendant la run
phase, vous pouvez utiliser / injecter des services .
Exemples:
1. Injecter le $http
service de la fonction d'initialisation du fournisseur WILL NOT travail
//ERRONEOUS
angular.module('myModule').provider('myProvider', function($http) {
// SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
...
this.$get = function() {
// code to initialize/configure the SERVICE goes here (executed during `run` stage)
return myService;
};
});
Puisque nous essayons d'injecter le $http
service dans une fonction qui est exécutée pendant la config
phase, nous obtiendrons une erreur:
Uncaught Error: Unknown provider: $http from services
Ce que cette erreur dit en fait, c'est que le $httpProvider
qui est utilisé pour créer le $http
service n'est pas encore prêt (puisque nous sommes encore dans la config
phase).
2. Injecter le $http
service de la fonction d' initialisation du service WILL travail:
//OK
angular.module('myModule').provider('myProvider', function() {
// SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
...
this.$get = function($http) {
// code to initialize/configure the SERVICE goes here (executed during `run` stage)
return myService;
};
});
Puisque nous injectons maintenant le service dans la fonction d'initialisation du service, qui est exécutée pendant la run
phase, ce code fonctionnera.