2013-05-20 21 views
6

Sadece bağımlılık enjeksiyonu öğreniyorum ve sanırım bunu anlamaya başlıyorum.AngularJS denetleyicilerinde bağımlılık enjeksiyonunu anlama

Ben doğru yolda olduğumu eğer

Örn .:

bu iki eşdeğer Are ... söyle?

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

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

cevap

12

İlk biraz açıklama: Eğer küresel bir işlev veya module.controller(...) yöntemin argüman olarak kullanarak bir denetleyici olarak deklare etmeleri

bağımlılık enjeksiyon için, hiç önemli değil. Bağımlılık enjektörü sadece işlevin kendisi ile ilgilidir. Yani ne aslında yaklaşık soruyorsun o ikisinin denklik geçerli:

// First 

function MyController($scope) {} 

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

// Second 

function($scope) {} 

Ve denetleyici işlevi enjektör için önemli değil, aynı zamanda anonim olup olmadığını, yukarıdaki iki gibi iyi olabilir, çünkü:

// First 

function MyController($scope) {} 

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

// Second 

function MyController($scope) {} 

Şimdi sıra iki denetleyicileri arasındaki tek fark bunlardan birinde $inject mülkiyetin varlığı olduğu açıktır.

Ve burada sorunuzun asıl cevap bu:

Bu iki kontrolörleri neredeyse aynıdır. Her ikisi de argüman olarak $scope alır ve aynı işlevi görür. Ancak, kodunuzu daha sonra küçültmeye karar verirseniz, yalnızca $inject dizisi üzerinde ayarlanmış olan sürüm düzgün şekilde çalışacaktır. Bunun nedeni, $inject dizisini belirtmezseniz veya satır içi açıklamalama yaklaşımını (http://docs.angularjs.org/guide/di#inlineannotation) kullanmazsanız, enjektörün ilgilendiğiniz bağımlılıkları bulmasının tek yolu işlev argümanlarınızın adlarını kontrol etmektir (servis kimlikleri). Ancak kıymetlendirme, bu argümanları rasgele olarak adlandırır ve böylece bağımlılıkları bu şekilde algılama şansını ortadan kaldırır.

Kodunuzu küçültecekseniz, bağımlıları $inject dizisini veya satır içi ek açıklamasını kullanarak açıkça belirtmeniz gerekir, aksi halde, herhangi bir sürüm de iyi çalışır. Eğer module.controller yöntemi kullanmaya gidiyoruz

7

, ilk örneğe eşdeğer olacaktır:

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

Bildirim bu yolu biz eğer böylece fonksiyonu ile birlikte $inject dize geçirerek Daha sonra en aza indirilir, hala çalışır.

+0

Teşekkürler ama bu, $ http ile çalışmak gibi görünmüyor ... burada bunun hakkında soruldu: http://stackoverflow.com/q/16664325 – user2283066

İlgili konular