Angular JS: ¿por qué la diferencia entre la inyección de módulo.config y la inyección de controlador?
Esto es algo que no pude averiguar al profundizar en el código de AngularJS, tal vez puedas ayudar a resolver el misterio.
Para mostrarlo, agregué un servicio al proyecto semilla de AngularJS:
function MyServiceProvider() {
console.log('its my service');
this.providerMethod = providerMethod;
function providerMethod() {
console.log('its my service.providerMethod');
}
this.$get = $get;
function $get() {
var innerInjectable = {
name: 'stam'
};
return innerInjectable;
}
}
var serviceModule = angular.module('myApp.services', []).
value('version', '0.1').
provider('myservice',MyServiceProvider);
Puede ver que este proveedor expone $ get y un determinado 'método de proveedor'.
Ahora, para el uso de la inyección: si llamamos configuración, podemos inyectar a toda la clase y obtener acceso al método del proveedor "externo":
serviceModule.config(function(myserviceProvider) {
console.log('myServiceProvider:',myserviceProvider);
myserviceProvider.providerMethod();
});
Pero cuando inyectamos esto a un controlador (note el nombre sin Proveedor), solo se expone el valor de retorno de $ get:
function MyCtrl1(myservice) {
console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];
La salida de la consola sigue como debería: es mi servicio myServiceProvider: Constructor {providerMethod: function, $ get: function} es my service.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam
¿Alguien puede explicar la diferencia? ¿La razón? muchas gracias por cualquier pensamiento
Lior
PD: He visto esta técnica en ui angular.nuevo ui-router (excelente proyecto!). Necesito acceso a la clase del proveedor externo para hacer la inyección en jazmín y otros lugares, sin éxito.