5

これは、AngularJS コードを掘り下げてもわかりませんでした。謎の解決に役立つかもしれません。

それを示すために、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);

このプロバイダーが $get と特定の「providerMethod」を公開していることがわかります。

ここで、インジェクションの使用について: config を呼び出すと、クラス全体をインジェクトして、「外部」プロバイダー メソッドにアクセスできます。

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

しかし、これをコントローラーに注入すると (プロバイダーのない名前に注意してください)、$get の戻り値のみが公開されます。

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

コンソール出力は次のとおりです: its my service myServiceProvider: Constructor {providerMethod: function, $get: function} its my service.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam

誰でも違いを説明できますか?理由?考えてくれてありがとう

リオール

PS: angular-ui new ui-router (優れたプロジェクト!)でこの手法を見てきました。ジャスミンやその他の場所でインジェクションを行うには、外部プロバイダー クラスにアクセスする必要があります - 役に立たない

4

2 に答える 2

4

Angular メーリング リストから、サービス、ファクトリー、プロバイダー、およびそれらのインジェクションの使用法を説明する素晴らしいスレッドを入手しました。ここで独自の質問に入れることにしました

具体的な答えは次のとおりです。構成時にプロバイダーの構成を許可するのは設計によるものです。

于 2013-03-27T18:01:18.353 に答える