6

依存性注入を学んでいるだけで、それを理解し始めていると思います。

私が正しい軌道に乗っているかどうか教えてください...

例: これら 2 つは同等ですか?

/* injection method */
function <controller_name>($scope) {}
<controller_name>.$inject = ['$scope'];

/* other method */
var app = angular.module('myApp');
app.controller(<controller_name>, function($scope) {});
4

2 に答える 2

12

最初に少し説明します。

依存性注入の場合、コントローラーをグローバル関数を使用して宣言するか、メソッドの引数として宣言するかは問題ではありませんmodule.controller(...)。依存関係インジェクターは、関数自体にのみ関心があります。したがって、あなたが実際に求めているのは、これら2つの同等性です。

// First

function MyController($scope) {}

MyController.$inject = [ '$scope '];

// Second

function($scope) {}

また、コントローラー関数が匿名かどうかはインジェクターには関係ないため、上記の 2 つは次のようになります。

// First

function MyController($scope) {}

MyController.$inject = [ '$scope '];

// Second

function MyController($scope) {}

これで、2 つのコントローラーの唯一の違いは、$inject一方のコントローラーにプロパティが存在することだけであることが明らかになりました。

そして、これがあなたの質問に対する実際の答えです:

これら 2 つのコントローラーはほとんど同じです。どちらも引数として を受け取り、$scope同じように機能します。ただし、後でコードを縮小することにした場合は、$inject配列が設定されたバージョンのみが正しく機能します。これは、$inject配列を指定せず、インライン アノテーション アプローチ ( http://docs.angularjs.org/guide/di#inlineannotation ) を使用しない場合、関心のある依存関係をインジェクターが見つける唯一の方法だからです。関数の引数の名前をチェックすることです (それらをサービス ID として扱います)。ただし、縮小すると、これらの引数にランダムに名前が付けられるため、このように依存関係を認識する機会がなくなります。

したがって、コードを縮小する場合は、配列またはインライン アノテーションを使用して依存関係を明示的に指定する必要があります$inject。そうしないと、どのバージョンでも問題なく動作します。

于 2013-05-21T01:06:50.000 に答える
7

メソッドを使用する場合module.controller、最初の例に相当するものは次のようになります。

var app = angular.module('myApp');
app.controller(<controller_name>, ['$scope', function($scope) {}]);

$injectこのように関数と共に文字列を渡していることに注意してください。後で最小化された場合でも機能します。

于 2013-05-21T01:12:31.440 に答える