33

プロバイダーメソッドでDIを行うことは可能ですか?

この例では

angular.module('greet',[])
.provider('greeter',function() {

  this.$get=function() {

  };
})
.service('greeterService',function($http){
  console.log($http);
})
;

サービスへの注入$httpは正しい実装のように見えますが、プロバイダー メソッドでは機能せず、エラーがスローされます。

不明なプロバイダー: $http

プロバイダー メソッドは DI と連携してサービスを注入しますか?

4

5 に答える 5

58

確か$httpにプロバイダーに注入できます。$get関数コンストラクターではなく、に表示されることを確認してください。次のように:

angular.module('greet',[]).provider('greeter',function() {
  this.$get = function($http) {

  };
});
于 2013-10-04T02:44:04.910 に答える
13

定数やその他のプロバイダーをプロバイダーに挿入できます。サービスや工場ではありません - 1 つの例外があります。サービスをプロバイダーに注入できるよう$injectorです - 少なくとも、AngularJS 1.3.16 では可能です。

.provider('foo', ['$injector', function ($injector) {
  var messagePrefix = $injector.get('msgPrefix');
  this.message = '';

  this.$get = function() {
    var that = this;
    return function() {
      return messagePrefix + that.message;
    }
  };
}])

メソッドの外部でインジェクターを使用することはできますが$get、構成時にサービスを取得することはできません。

デモについては、こちらを参照してください

于 2015-06-09T23:42:39.080 に答える
7

IgrCndd の回答をフォローアップすると、潜在的な不快感を回避できる可能性があるパターンを次に示します。

angular.module('greet',[]).provider('greeter', function() {

    var $http;

    function logIt() {
        console.log($http);
    }

    this.$get = ['$http', function(_$http_) {
        $http = _$http_;

        return {
            logIt: logIt
        };
    }];
});

これが同等のサービスにいかに似ているかに注目してください。

angular.module('greet',[]).factory('greeter', ['$http', function($http) {

    function logIt() {
        console.log($http);
    }

    return {
        logIt: logIt
    };
});
于 2016-01-07T14:14:55.140 に答える
3

実際には、$get に依存関係を注入し、それを保存して、$get から取得したものに使用する必要があります。全然綺麗じゃない…

于 2014-04-27T16:01:42.417 に答える
3

いいえ、プロバイダー自体にサービスを注入することはできません。プロバイダーの $get メソッドにサービスを注入することは、サービスをファクトリに注入することと同じですが、プロバイダー関数に直接注入することはできません。

$get とプロバイダー自体の違いは、提供するサービスをインスタンス化するときに $get が実行されるのに対し、プロバイダーはモジュールの読み込みフェーズ中に実行されることです。

これは、モジュールのモジュールのロード/構成フェーズ中にサービスをまったく使用できないことを意味します。これは、アプリのルートや状態を定義するときなど、構成ブロック内で実行するすべてのものであり、どのサービスも利用できません。

プロバイダー以外に構成ブロックに挿入できる唯一のものは定数です。

IgrCndd が提案したようなことを行うことができます。しかし、プロバイダーの目的である構成ブロックでプロバイダーを使用する必要がある場合は、かなり後になるまで値が注入されません。したがって、promise を使用して厄介なハックを行わない限り、機能しません。

注射剤に関する詳細情報

于 2015-04-28T13:16:02.573 に答える