11

私は AngularJS をいじくり回しており、どこでも使用できるように単一の JS ファイルにパッケージ化したいディレクティブとサービスの小さなコレクションを作成しました。

モジュールが API 呼び出しなどに必要とする Web サイト固有の設定がいくつかあります。構成可能なモジュールを作成するAngularの方法が何であるか疑問に思っています。明らかに、Web サイトごとに再利用可能な JS ファイルを変更する必要はありません。各 Web サイトで値が同じままであることを考えると、各関数呼び出しで値を引数として渡すのは非常に面倒なように思えます。グローバル変数はできるだけ避けたいと思います。

求める答えを得るために多くの質問を検索しましたが、これまでに見つけた最も近いパターンは、再利用可能なモジュールを「設定」などと呼ばれる含まれていないモジュールに依存させ、そのモジュールをページの JS ファイルを使用して、再利用可能なモジュールがそこから値を取得できるようにします。これが私が何を意味するかを示す例です。

これは私には逆に思えます。これは、値を引数として渡すのではなく、グローバル値から値を取得する関数を持つようなものです。

これは本当にこれを行う最善の方法ですか、それとも代替手段はありますか?

4

1 に答える 1

11

プロバイダーを探しているようですね。

アプリケーションの起動前に作成する必要があるアプリケーション全体の構成用の API を公開する場合にのみ、プロバイダー レシピを使用する必要があります。これは通常、動作がアプリケーション間でわずかに異なる必要がある再利用可能なサービスに対してのみ興味深いものです。

プロバイダーの非常に基本的な例を次に示します。

myMod.provider('greeting', function() {
  var text = 'Hello, ';

  this.setText = function(value) {
    text = value;
  };

  this.$get = function() {
    return function(name) {
      alert(text + name);
    };
  };
});

myMod.serviceこれにより、またはと同じように新しいサービスが作成されますが、myMod.factory構成時に使用できる追加の API、つまりsetTextメソッドが提供されます。configブロック単位でプロバイダーにアクセスできます。

myMod.config(function(greetingProvider) {
  greetingProvider.setText("Howdy there, ");
});

ここで、greetingサービスを注入すると、Angular はプロバイダーの$getメソッドを呼び出し (パラメーターで要求するサービスを注入します)、返されたものをすべて返します。この場合、$get名前で呼び出されたときに、で設定したもので名前を警告する関数を返しますsetText

myMod.run(function(greeting) {
  greeting('Ford Prefect');
});

// Alerts: "Howdy there, Ford Prefect"

これは、他のプロバイダーが好き$httpProviderで機能する方法とまったく同じ$routeProviderです。

プロバイダーと依存関係の注入に関する一般的な情報については、依存関係の注入に関するこの SO の質問を確認してください。

于 2014-05-12T02:20:37.597 に答える