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 config
fase, todos os provedores são inicializados e todas as config
seções são executadas. As config
seçõ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 run
fase todas as run
seções são executadas. Nesta fase, os provedores estão prontos e podem criar serviços -> durante a run
fase você pode usar / injetar serviços .
Exemplos:
1. Injetar o $http
serviç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 $http
serviço em uma função que é executada durante a config
fase, obteremos um erro:
Uncaught Error: Unknown provider: $http from services
O que esse erro está realmente dizendo é que o $httpProvider
que é usado para criar o $http
serviço ainda não está pronto (pois ainda estamos na config
fase).
2. A injeção do $http
serviç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 run
fase, esse código funcionará.