La conclusión es:
- Usted NO puede inyectar un servicio a la sección de configuración del proveedor .
- Usted PUEDE inyectar un servicio dentro de la sección que inicializa el servicio del proveedor .
Detalles:
El marco angular tiene un proceso de inicialización de 2 fases:
FASE 1: Configuración
Durante la config
fase, todos los proveedores se inicializan y todas las config
secciones se ejecutan. Las config
secciones pueden contener código que configura los objetos del proveedor y, por lo tanto, se pueden inyectar con los objetos del proveedor. Sin embargo, dado que los proveedores son las fábricas de los objetos de servicio y en esta etapa los proveedores no están completamente inicializados / configurados -> no puede pedirle al proveedor que cree un servicio para usted en esta etapa -> en la etapa de configuración no puede usar / servicios de inyección . Cuando se completa esta fase, todos los proveedores están listos (no se pueden realizar más configuraciones de proveedores una vez completada la fase de configuración).
FASE 2: Ejecutar
Durante la run
fase run
se ejecutan todas las secciones. En esta etapa, los proveedores están listos y pueden crear servicios -> durante la run
fase puede usar / inyectar servicios .
Ejemplos:
1. La inyección del $http
servicio a la función de inicialización del proveedor NO 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 intentando inyectar el $http
servicio en una función que se ejecuta durante la config
fase, obtendremos un error:
Uncaught Error: Unknown provider: $http from services
Lo que realmente dice este error es que el $httpProvider
que se usa para crear el $http
servicio aún no está listo (ya que todavía estamos en la config
fase).
2. Inyectar el $http
servicio a la función de inicialización del servicio 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;
};
});
Dado que ahora estamos inyectando el servicio en la función de inicialización del servicio, que se ejecuta durante la run
fase, este código funcionará.