$injector
概要
$injectorは、プロバイダー、インスタンス化のタイプ、メソッド呼び出し、 モジュール読み込みとして定義されたオブジェクトのインスタンスを取得するために使用されます。
下記は常にtrueを保持します。
var $injector = angular.injector();
expect($injector.get('$injector')).toBe($injector);
expect($injector.invoke(function($injector){
return $injector;
}).toBe($injector);
関数アノテーションの注入
JavaScriptはアノテーションを持ちませんが、アノテーションは依存注入に必要とされるものです。 下記は、全てインジェクションの引数を持つ正しいアノテーション関数であり、同じように評価されます。
// inferred: 推察 (コードが圧縮化・難読化されている場合は動作しません)
$injector.invoke(function(serviceA){});
// annotated: アノテーション(注釈)
function explicit(serviceA) {};
explicit.$inject = ['serviceA'];
$injector.invoke(explicit);
// inline: インライン
$injector.invoke(['serviceA', function(serviceA){}]);
Inference(推察)
JavaScriptでは、functionに対してtoString()
を実行すると、関数定義が返ります。
この定義は、解析することで関数の引数を抜き出すことが可能です。
注意: この方法は、引数名の変更が伴うコードの圧縮化・難読化によって動作しなくなります。
$inject Annotation
$inject
プロパティに追加することによって、注入の引数となる関数を指定することが可能です。
Inline
注入するものの名前を配列で指定し、その配列内の最後の項目で呼び出す関数を指定します。
annotate(fn)
注入をリクエストした関数のサービス名の配列を返します。 このAPIはインジェクターによって、関数が実行された際にサービスが関数に注入される必要があるのかを決定するのに使用されます。 関数が必要な依存関係について、アノテーションするには3つの方法があります。
引数名
関数の引数から依存関係を抜き出すのが最も単純な方式です。
これは、toString()
メソッドを使用して関数を文字列に変換することで、引数名を抜き出すことでそれを行います。
// 関数を定義
function MyController($scope, $route) {
// ...
}
// テスト
expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
この方法は、コードの圧縮化/難読化では動作しません。 そのため、以降のアノテーションの方法ではサポートしてるため、状況に応じて使い分けてください。
$injectプロパティ
もし、関数が$injectプロパティを持ち、その値が文字列の配列である場合、 文字列として表されているサービスが関数に注入されます。
// コントローラーの定義
var MyController = function(obfuscatedScope, obfuscatedRoute) {
// ...
}
// 依存関係を関数に定義
MyController.$inject = ['$scope', '$route'];
// テスト
expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
アノテーション配列
$injectプロパティの設定が非常に不便な場合、インラインの注入関数が望まれることがよくあります。 これらの状況から、圧縮化などを行っても有効に動作させるために、アノテーション配列による依存関係の指定がより良い選択となるでしょう。
// このように書きたいが…(圧縮化/難読化で問題になる)
injector.invoke(function($compile, $rootScope) {
// ...
});
// 改行を余儀なくされる場合
var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
// ...
};
tmpFn.$inject = ['$compile', '$rootScope'];
injector.invoke(tmpFn);
// インライン関数をサポートすることで、アノテーションがサポートされ、これがより良い方法でしょう
injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
// ...
}]);
// テスト
expect(injector.annotate(
['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
).toEqual(['$compile', '$rootScope']);
引数 | 説明 |
---|---|
fn |
型: 関数が依存するサービスの名前を上記のように取得する必要があります。 |
戻り値 | 説明 |
型: 関数に必要なサービス名です。 |
get(name)
サービスのインスタンスが返ります。
引数 | 説明 |
---|---|
name |
型: 取得するインスタンスの名前を指定します。 |
戻り値 | 説明 |
型: インスタンスが返ります。 |
has(Name)
メソッドを実行し、$injectorからメソッド引数を供給します。
引数 | 説明 |
---|---|
fn |
型: 実行する関数を指定します。 関数の引数は$injectアノテーションのルールに沿って注入されます。 |
self(optional) |
型:
実行されるメソッド内で |
locals(optional) |
型: 任意のオブジェクトを指定します。 指定されると、$injectorが調べる前より先にこのオブジェクトから引数名が読まれます。(翻訳に自信なし) |
戻り値 | 説明 |
型:
実行された |
instantiate(Type, locals)
JSタイプの新しいインスタンスを作成します。 このメソッドは、コンストラクタ関数を取得し、このコンストラクタ関数がnew(相当の操作)を実行し、 コンストラクタのアノテーションによって指定されたとされる、コンストラクタ関数の全ての引数を供給します。
引数 | 説明 |
---|---|
Type |
型: アノテーションされたコンストラクタ関数です。 |
locals(optional) |
型: 任意でオブジェクトを指定します。 もし、指定されると$injectorから参照される前に、引数名が最初のオブジェクトから読まれます。 |
型: Typeのnewされたインスタンスが返ります。 |
invoke(fn, self, locals)
メソッドを実行し、そのメソッドに$injectorからの引数を供給します。
引数 | 説明 |
---|---|
fn |
型: 実行する関数を指定します。 関数の引数は、$injectアノテーションのルールにそって注入されます。 |
self(optional) |
型: 実行されたメソッドのために指定します。 |
locals(optional) |
型: 任意のオブジェクトを指定します。 もし指定されると、$injectorに参照される前に、初めにこのオブジェクトに引数名が読まれます。 |
型: fn関数実行によって返される値です。 |
© 2017 Google
Licensed under the Creative Commons Attribution License 3.0.
このページは、ページトップのリンク先のAngularJS公式ドキュメント内のページを翻訳した内容を基に構成されています。 下記の項目を確認し、必要に応じて公式のドキュメントをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- AngularJSの更新頻度が高いため、元のコンテンツと比べてドキュメントの情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報やより分かり易くするための追記を行っている事があります。