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 configphase, tous les fournisseurs sont initialisés et toutes les configsections sont exécutées. Les configsections 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 runphase, toutes les runsections sont exécutées. À ce stade, les fournisseurs sont prêts et peuvent créer des services -> pendant la runphase, vous pouvez utiliser / injecter des services .
Exemples:
1. Injecter le $httpservice 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 $httpservice dans une fonction qui est exécutée pendant la configphase, nous obtiendrons une erreur:
Uncaught Error: Unknown provider: $http from services 
Ce que cette erreur dit en fait, c'est que le $httpProviderqui est utilisé pour créer le $httpservice n'est pas encore prêt (puisque nous sommes encore dans la configphase).
2. Injecter le $httpservice 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 runphase, ce code fonctionnera.