6

依存関係注入を学ぶだけで、私はそれを理解し始めていると思います。私は正しい軌道に乗ってる場合AngularJSコントローラの依存関係注入を理解する

を教えてください...

例えば:は、これら2つの同等はありますか?まず

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

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

答えて

12

少し明確化:依存性の注入のために

、あなたがグローバル関数やmodule.controller(...)メソッドの引数としてを使用してコントローラを宣言するかどうかは関係ありません。依存性インジェクタは機能自体についてのみ心配しています。それでは、あなたが実際にについて尋ねているのは、これら二つの等価性は次のとおりです。

// First 

function MyController($scope) {} 

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

// Second 

function($scope) {} 

とコントローラ機能は、インジェクタのために重要ではありません。また、匿名であるかどうかにかかわらず、上記の二つは全く同じようにできるため。

// First 

function MyController($scope) {} 

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

// Second 

function MyController($scope) {} 

は、今ではあなたの二つのコントローラ間の唯一の違いは、そのうちの一つで$inject財産の存在であることは明らかです。

そしてここでは、あなたの質問に、実際の答えだ:

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

コードを小さくする場合は、$inject配列またはインライン注釈を使用して依存関係を明示的に指定する必要があります。そうしないと、すべてのバージョンがまったく同じように動作します。

7

あなたがmodule.controllerメソッドを使用するつもりなら、あなたの最初の例と同じで次のようになります。

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

お知らせこの方法は、我々は機能と一緒に$inject文字列を渡していることを、もしそのようにそれは後で最小化され、それでも動作します。

+0

ありがとうございますが、それは '$ http'でうまくいかないようです...ここでそれについて尋ねられます:http://stackoverflow.com/q/16664325 – user2283066

関連する問題