$provide
- 概要
- constant(name, value)
- decorator(name, decorator)
- factory(name, $getFn)
- provider(name, provider)
- service(name, constructor)
- value(name, value)
概要
$provideサービスは、$injectorでコンポーネントを登録するためのメソッドを複数持ちます。 これらの関数の多くは、angular.Module としてもアクセス可能です。
  Angularのserviceは、サービスファクトリーによって作成されるシングルトンのオブジェクトです。
  これらのサービスファクトリーは、サービスプロパイダーによって順に作成された関数です。
  サービスプロバイダーは、コンストラクタ関数です。
  インスタンス化される際に、サービスファクトリー関数を保持する$getと呼ばれるプロパティを含める必要があります。
  
サービスをリクエストすると、$injectorは正しいサービスプロバイダーを探し、それをインスタンス化し、 サービスファクトリー関数をサービスのインスタンスを取得するために、その$getの呼び出しを請け負います。(翻訳に自信なし)
サービスが設定オプションを持たないことがよくあり、サービスプロバイダーにメソッドを追加する必要がありません。 プロバイダーは、$getプロパティを持つコンストラクタ関数に過ぎません。 これらのケースのために、$provideサービスはプロバイダーの指定なしにサービスを登録する追加のヘルパーメソッドを持ちます。
個々のメソッドの詳しい情報とコードを参照してみてください。
constant(name, value)
$injectorを使用して、 固定の文字列、数値、配列、オブジェクト、または関数を登録します。 valueメソッドと異なり、モジュールのconfig関数(angular.Module#config参照)に注入可能で、 Angularのdecoratorによって上書きすることは出来ません。
| 引数 | 説明 | 
|---|---|
| name | 
          型: 定数の名前を指定します。 | 
| value | 
          型: 定数の値を指定します。 | 
| 戻り値 | 説明 | 
| 
          型: 登録されているインスタンスが返ります。 | 
例
下記は、constant(定数)を作成する例になります。
$provide.constant('SHARD_HEIGHT', 306);
$provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);
$provide.constant('double', function(value) {
  return value * 2;
});
decorator(name, decorator)
$injectorを使用してサービスデコレーターを登録します。 サービスデコレーターはサービスの作成過程に割り込むことで、 サービスの振る舞いを上書き、または修正することを可能にします。 デコレーターによって返されたオブジェクトは、オリジナルサービスまたは新しいサービスオブジェクトかもしれません。
| 引数 | 説明 | 
|---|---|
| name | 
          型: デコレートするサービスの名前を指定します。 | 
| decorator | 
          型: この関数は、サービスがインスタンス化が必要となった際に実行され、 デコレートされたサービスのインスタンスを返すべきです。 これはinjector.invokeメソッドを使用して呼び出されるため、 完全に注入用(翻訳に自信なし)です。 下記は、ローカル(?)の注入引数です。 
 | 
例
下記は、$logサービスの警告(warn)を、 割り込みが$log.warn()を呼び出すことによって、エラー(error)に変換している例です。
$provider.decorator('$log', ['$delegate', function($delegate) {
  $delegate.warn = $delegate.error;
  return $delegate;
}]);
factory(name, $getFn)
呼び出されるとサービスインスタンスを返す、サービスファクトリーを登録します。 これはサービスを登録するためのショートカットで、そのプロバイダーは$getプロパティだけの構成で、 サービスファクトリー関数によって与えられます。 もし、プロバイダー内にサービスの構成が必要無いのであれば、 $provide.factor(getFn)を使用すべきです。
| 引数 | 説明 | 
|---|---|
| name | 
          型: インスタンスの名前です。 | 
| $getFn | 
          型: インスタンス作成のための関数を指定します。 内分的には、$provide.provider(name, {$get: $getFn})の略記になります。 | 
| 戻り値 | 説明 | 
| 
          型: 登録したプロバイダーのインスタンスです。 | 
例
下記は、サービス登録の例になります。
$provide.factory('ping', ['$http', function($http) {
  return function ping() {
    return $http.send('/ping');
  };
}]);
注入すると、下記のようにしてこのサービスを使用します。
someModule.controller('Ctrl', ['ping', function(ping) {
  ping();
}]);
provider(name, provider)
$injectorを使用して、プロバイダー関数を登録します。 プロバイダー関数はコンストラクタ関数で、このインスタンスがサービスのための"供給(providing)"を請け負います。
サービスプロバイダーの名前は、サービスの名前から始まりその後ろに"Provider"が付きます。 例えば$logサービスは、 $logProviderと呼ばれるプロバイダーを持ちます。
サービスプロバイダーのオブジェクトは、プロバイダーとそのサービスを構成することが出来る追加のメソッドを持つことが可能です。 重要なことになりますが、$getメソッドによって作成されるサービスの種類、 またはどのようにしてサービスが動作するかを設定することが出来ます。 例えば、$logProviderは、 $logサービスがデバッグメッセージをコンソール上に表示するか否かを指定させるdebugEnabledメソッドを持ちます。
| 引数 | 説明 | 
|---|---|
| name | 
          型: 
          インスタンスの名前を指定します。
          注意: プロバイダーは | 
| provider | 
          型: もし、プロバイダーが | 
| 戻り値 | 説明 | 
| 
          型: 登録されたプロバイダーインスタンスです。 | 
例
下記は、シンプルなイベントトラッキングサービスと$provide.provider()を使用してそれを登録する方法の例です。
// eventTrackerプロバイダーを定義
function EventTrackerProvider() {
  var trackingUrl = '/track';
  // トラックされたイベントをどこに保存するかを
  // 設定するためのプロバイダーメソッド
  this.setTrackingUrl = function(url) {
    trackingUrl = url;
  };
  // サービスファクトリー関数
  this.$get = ['$http', function($http) {
    var trackedEvents = {};
    return {
      // イベントをトラックするには、これを呼びます。
      event: function(event) {
        var count = trackedEvents[event] || 0;
        count += 1;
        trackedEvents[event] = count;
        return count;
      },
      // トラックされたイベントをtrackingUrlに保存するには、
      // これを呼びます。
      save: function() {
        $http.post(trackingUrl, trackedEvents);
      }
    };
  }];
}
//テスト
describe('eventTracker', function() {
  var postSpy;
  beforeEach(module(function($provide) {
    // eventTrackerプロバイダーを登録
    $provide.provider('eventTracker', EventTrackerProvider);
  }));
  beforeEach(module(function(eventTrackerProvider) {
    // eventTrackerプロバイダーの設定
    eventTrackerProvider.setTrackingUrl('/custom-track');
  }));
  it('tracks events', inject(function(eventTracker) {
    expect(eventTracker.event('login')).toEqual(1);
    expect(eventTracker.event('login')).toEqual(2);
  }));
  it('saves to the tracking url', inject(function(eventTracker, $http) {
    postSpy = spyOn($http, 'post');
    eventTracker.event('login');
    eventTracker.save();
    expect(postSpy).toHaveBeenCalled();
    expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');
    expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');
    expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });
  }));
});
service(name, constructor)
サービスインスタンスを作るために実行されるサービスのコンストラクタを登録します。 プロバイダの$getプロパティはこのサービスコンスタラクタ関数でサービスインスタンスを作成するのに使用され、 これはそのサービスを登録するための略記です。
もし、タイプ/classとしてサービスを定義したいのであれば、$provide.service(class)を使用すべきです。 CoffeeScriptする際に、これはよく使用されます。
| 引数 | 説明 | 
|---|---|
| name | 
          型: インタンス名を指定します。 | 
| constructor | 
          型: インスタンス化されるクラス(コンストラクタ関数)を指定します。 | 
| 戻り値 | 説明 | 
| 
          型: 登録したプロバイダーのインスタンスが返ります。 | 
例
下記は、CoffeeScriptクラスとして定義された$provide.service(class)を使用して、サービスを登録する例です。
class Ping
  constructor: (@$http)->
  send: ()=>
    @$http.get('/ping')
$provide.service('ping', ['$http', Ping])
その後に注入を行い、下記のようにこのサービスを使用します。
someModule.controller 'Ctrl', ['ping', (ping)->
  ping.send()
]
value(name, value)
$injectorを使用して、 文字列、数値、配列、オブジェクトまたは関数などのvalueサービスを登録します。 プロバイダーの$getプロパティは引数無しでvalueサービスを返すファクトリー関数で、これはそのサービス登録の略記です。
valueサービスは、モジュールの設定関数(angular.Module#config参照)に注入出来ないことを除いて、 constantサービスと似ていますが、Angularのデコレーターによって上書きすることが可能です。
| 引数 | 説明 | 
|---|---|
| name | 
          型: インスタンスの名前を指定します。 | 
| value | 
          型: 値を指定します。 | 
| 戻り値 | 説明 | 
| 
          型: 登録したプロバイダーのインスタンスです。 | 
例
下記は、valueサービス作成の例になります。
$provide.constant('ADMIN_USER', 'admin');
$provide.constant('RoleLookup', { admin: 0, writer: 1, reader: 2 });
$provide.constant('halfOf', function(value) {
  return value / 2;
});
    © 2017 Google
    Licensed under the Creative Commons Attribution License 3.0.
  
このページは、ページトップのリンク先のAngularJS公式ドキュメント内のページを翻訳した内容を基に構成されています。 下記の項目を確認し、必要に応じて公式のドキュメントをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- AngularJSの更新頻度が高いため、元のコンテンツと比べてドキュメントの情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報やより分かり易くするための追記を行っている事があります。