Kątowy JS: dlaczego różnica między wtryskiem module.config a wtryskiem sterownika?

To jest coś, czego nie mogłem zrozumieć, zagłębiając się w kod AngularJS, może możesz pomóc rozwiązać zagadkę.

Aby to pokazać, dodałem usługę do projektu seed 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);

Widać, że ten dostawca ujawnia $ get i pewnego 'providerMethod'.

Teraz, do użycia wtrysku: Jeśli wywołamy config, możemy wstrzyknąć całą klasę i uzyskać dostęp do metody dostawcy zewnętrznego:

serviceModule.config(function(myserviceProvider) {
    console.log('myServiceProvider:',myserviceProvider);
    myserviceProvider.providerMethod();
});

Ale kiedy wstrzykniemy to kontrolerowi (zwróćmy uwagę na nazwę bez dostawcy), odsłonięta zostaje tylko wartość zwracana $ get:

function MyCtrl1(myservice) {
    console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];

Dane wyjściowe konsoli są następujące: moja usługa myServiceProvider: Constructor {providerMethod: function, $ get: function} its my service.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam

Czy ktoś może wyjaśnić różnicę? Powód? wielkie dzięki za każdą myśl

Lior

PS: Widziałem tę technikę w kanciastym uiNowy ui-router (doskonały projekt!). Potrzebuję dostępu do zewnętrznej klasy dostawców, aby zrobić zastrzyk w jaśminie i innych miejscach - bezskutecznie

questionAnswers(2)

yourAnswerToTheQuestion