Angular JS: Warum der Unterschied zwischen module.config Injection und Controller Injection?
Dies ist etwas, was ich nicht herausfinden konnte, wenn ich mich in den AngularJS-Code vertiefte. Vielleicht können Sie dabei helfen, das Rätsel zu lösen.
Um es zu zeigen, habe ich dem AngularJS-Seed-Projekt einen Service hinzugefügt:
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);
Sie können sehen, dass dieser Anbieter $ get und eine bestimmte 'providerMethod' verfügbar macht.
Nun zur Injection-Verwendung: Wenn wir config aufrufen, können wir die gesamte Klasse injizieren und erhalten Zugriff auf die 'äußere' Provider-Methode:
serviceModule.config(function(myserviceProvider) {
console.log('myServiceProvider:',myserviceProvider);
myserviceProvider.providerMethod();
});
Wenn wir dies jedoch in einen Controller einspeisen (notieren Sie sich den Namen ohne Provider), wird nur der Rückgabewert $ get verfügbar gemacht:
function MyCtrl1(myservice) {
console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];
Die Konsolenausgabe erfolgt wie gewünscht: myServiceProvider: Constructor {providerMethod: function, $ get: function} myService.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam
Kann jemand den Unterschied erklären? Der Grund? vielen dank für jeden gedanken
Lior
PS: Ich habe diese Technik in Angular-Ui gesehenNeu Ui-Router (ausgezeichnetes Projekt!). Ich benötige Zugriff auf die äußere Anbieterklasse, um Injektionen in Jasmin und an anderen Orten durchführen zu können - ohne Erfolg