サービスの依存性の管理
説明
Angularは、サービスがそのインスタンスの構築のために必要な依存関係として他のサービスを宣言することができます。
依存性を宣言するには、ファクトリー関数の表記内でそれを指定し、 $injectプロパティへ識別する文字列の配列としての設定、または配列アノテーションのどちらかを使用することによって、 関数へアノテートします。 任意で、$injectプロパティ宣言は省略することが出来ます。 ("Inferring $inject"を参照。ただし、これは現在は実験用の機能となっているので注意してください。)
配列アノテーションの使用例
function myModuleCfgFn($provide) {
$provide.factory('myService', ['dep1', 'dep2', function(dep1, dep2) {}]);
}
$injectプロパティの使用例
function myModuleCfgFn($provide) {
var myServiceFactory = function(dep1, dep2) {};
myServiceFactory.$inject = ['dep1', 'dep2'];
$provide.factory('myService', myServiceFactory);
}
DI推察の使用例(ファイルの圧縮化(minify)を行う場合は、使用しないでください)
function myModuleCfgFn($provide) {
$provide.factory('myService', function(dep1, dep2) {});
}
下記は2つのサービスの例で、1つはもう1つのサービスに依存しており、 両方のサービスはAngularフレームワークが提供する別のサービスに依存しています。
/**
* batchLogサービスは、メッセージをキューに入れ、
* 50秒ごとにconsole.log出力(フラッシュ)します。
*
* @param {*} message ログ出力するメッセージ
*/
function batchLogModule($provide){
$provide.factory('batchLog', ['$timeout', '$log', function($timeout, $log) {
var messageQueue = [];
function log() {
if (messageQueue.length) {
$log('batchLog messages: ', messageQueue);
messageQueue = [];
}
$timeout(log, 50000);
}
// 周期チェック開始
log();
return function(message) {
messageQueue.push(message);
}
}]);
/**
* routeTemplateMonitorは、各$route変更をモニターし、
* batchLogサービスを介して現在のテンプレートをログ出力します。
*/
$provide.factory('routeTemplateMonitor',
['$route', 'batchLog', '$rootScope',
function($route, batchLog, $rootScope) {
$rootScope.$on('$routeChangeSuccess', function() {
batchLog($route.current ? $route.current.template : null);
});
}]);
}
// アプリケーションを起動するメインサービスの取得
angular.injector([batchLogModule]).get('routeTemplateMonitor');
このサンプルの注目すべき点は下記の通りです。
- batchLogサービスは、組み込みの$timeoutと$logサービスに依存しており、 一括でconsole.logにメッセージをログ出力してくれます。
- routeTemplateMonitorサービスは、batchLogサービスだけでなく、 組み込みの$routeサービスにも依存しています。
- これらのサービスは両方とも、注入アノテーションにファクトリー関数の表記と配列アノテーションを使用して、 依存性の宣言をしています。 配列内の依存性を示す文字列の順番は重要で、 これは、ファクトリー関数の表記内の引数名の順番と同じでなければいけません。 依存関係が関数の表記から推測されていない限り、 IDとその順序を示すこの配列は、インジェクターが注入するサービスとその順番を決定するのに使用されます。
関連トピック
関連API
- Angular Service API
- Angular Injector API
© 2017 Google
Licensed under the Creative Commons Attribution License 3.0.
このページは、ページトップのリンク先のAngularJS公式ドキュメント内のページを翻訳した内容を基に構成されています。 下記の項目を確認し、必要に応じて公式のドキュメントをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- AngularJSの更新頻度が高いため、元のコンテンツと比べてドキュメントの情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報やより分かり易くするための追記を行っている事があります。