2014-06-05 64 views
0

只見這兩個型動物圖案AngularJS定義控制器:在AngularJS中定義控制器的兩種方法?

myApp.controller('myControllerName', function($scope) { 
    // ... my controller code ... 
}); 

myApp.controller('myControllerName', ['$scope', function($scope) { 
    // ... my controller code ... 
}]); 

在依賴注入,分別添加的參數。

這兩個編碼例程有什麼區別?我很想爲JavaScript和AngularJS低級方面提供詳細的答案。

回答

3

第二種方法用於解決縮小問題。

由於角度推斷控制器的依賴從 參數名稱控制器的構造函數,如果你要 縮小爲PhoneListCtrl控制器的JavaScript代碼,它的所有 函數參數將精縮爲好,注入器的依賴關係將無法正確識別服務。

我們可以通過與名稱之間的依賴關係 ,作爲字符串提供,其將不會精縮

A Note on Minification

+0

因此,如果我沒有計劃縮小我的代碼,是否總是使用第一種方式?它是否適用於各種依賴注入?在這種情況下,是否希望編寫一個更短,更易讀的代碼(以及更少的代碼重複)? – Reflection

+0

@反射是,如果你沒有計劃縮小你的代碼(你確定嗎?:)),你可以使用第一種模式。總之這兩種方法都是正確的。 –

+0

爲了確保:如果我使用的是NodeJS,不會縮小JavaScript代碼,就像在傳統網站的服務器端縮小PHP代碼一樣(據我所知,這種事情從未發生過)? – Reflection

0

兩者都會做同樣的事情,但是當我們縮小代碼時,後者會很有用。

縮小代碼將縮短函數中的局部變量和參數名稱。 例如,您的代碼段將被改變爲如下縮小後:

myApp.controller('myControllerName', function(a) { 

}); 

,並根據參數名

myApp.controller('myControllerName', ['$scope', function(a) { 
    // ... my controller code ... 
}]); 

由於角注射服務,也不會找到名爲提供商'a',所以它失敗了。

1

兩個例子都將有同樣的效果註釋功能克服了這個問題。使用第一種模式時Angular通過將函數轉換爲字符串來分析參數名稱。當使用第二種模式時,名稱明確提供爲字符串。

第二種模式很有用,因爲它是縮減生產代碼的良好實踐。任何好的minifier將重命名參數的標識,因此第一個例子最終會是這樣的:

a.controller('myControllerName',function(a){}); 

在這種情況下角將不再知道注入哪一個服務,因爲它會分析參數的名稱,得到a並嘗試注入a服務(可能存在也可能不存在,但絕對不是你想要的)。

第二個例子將minfiy到這樣的事情:

a.controller('myControllerName',['$scope',function(a){}]); 

這一次角將提供正確的服務。控制器功能a內部是對所提供服務的引用,所有內容都將按預期工作。

+0

謝謝。請參閱我對Artem Petrosian的回答的評論。 – Reflection

+1

是的,你可以使用第一種模式。有許多工具(如[Grunt ngmin])(https://github.com/btford/grunt-ngmin),您可以使用這些工具在構建時自動化轉換爲陣列模式,無論如何應該將縮小成爲未來需求。 –

+0

非常感謝。 – Reflection