O resultado final é:
- Você NÃO PODE injetar um serviço na seção de configuração do provedor .
- Você PODE injetar um serviço na seção que inicializa o serviço do provedor .
Detalhes:
A estrutura angular tem um processo de inicialização de 2 fases:
FASE 1: Config
Durante a configfase, todos os provedores são inicializados e todas as configseções são executadas. As configseções podem conter código que configura os objetos do provedor e, portanto, podem ser injetados com objetos do provedor. No entanto, uma vez que os provedores são as fábricas para os objetos de serviço e, neste estágio, os provedores não estão totalmente inicializados / configurados -> você não pode pedir ao provedor para criar um serviço para você neste estágio -> no estágio de configuração você não pode usar / injetar serviços . Quando esta fase é concluída, todos os provedores estão prontos (nenhuma configuração de provedor pode ser feita depois que a fase de configuração for concluída).
FASE 2: Executar
Durante a runfase todas as runseções são executadas. Nesta fase, os provedores estão prontos e podem criar serviços -> durante a runfase você pode usar / injetar serviços .
Exemplos:
1. Injetar o $httpserviço na função de inicialização do provedor NÃO funcionará
//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;
};
});
Como estamos tentando injetar o $httpserviço em uma função que é executada durante a configfase, obteremos um erro:
Uncaught Error: Unknown provider: $http from services
O que esse erro está realmente dizendo é que o $httpProviderque é usado para criar o $httpserviço ainda não está pronto (pois ainda estamos na configfase).
2. A injeção do $httpserviço na função de inicialização do serviço FUNCIONARÁ :
//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;
};
});
Como agora estamos injetando o serviço na função de inicialização do serviço, que é executado durante a runfase, esse código funcionará.