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 configfase, todos los proveedores se inicializan y todas las configsecciones se ejecutan. Las configsecciones 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 runfase runse ejecutan todas las secciones. En esta etapa, los proveedores están listos y pueden crear servicios -> durante la runfase puede usar / inyectar servicios .
Ejemplos:
1. La inyección del $httpservicio 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 $httpservicio en una función que se ejecuta durante la configfase, obtendremos un error:
Uncaught Error: Unknown provider: $http from services
Lo que realmente dice este error es que el $httpProviderque se usa para crear el $httpservicio aún no está listo (ya que todavía estamos en la configfase).
2. Inyectar el $httpservicio 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 runfase, este código funcionará.