2016-09-17 17 views
3

AngularJS中的依賴注入如何實際工作?AngularJS如何與JS縮小器一起工作

是的,我讀了很多東西,我知道如何使用它。

假設我們有以下的控制器:

app.controller('LoginCtrl', ['$scope', '$rootScope', '$http', '$location', function($scope, $rootScope, $http, $location) { /* ... */ }]); 

我知道,我們應該使用數組傳遞到能夠使用JS minifiers,所以角就知道依賴的真名呢。

假設我們實際使用JS縮小器,並且$scope被轉換爲$s。 Angular將如何知道這個$s實際上是$scope,所以它應該具有與$scope文檔中所描述的相同的接口?

+0

我相信原因是因爲Angular知道$ location參數可以作爲參數提供,它允許全局的$ scope變量在縮小的代碼中提供必要的上下文。 –

+0

@Benjamin Dean對不起,我不明白。請你詳細說明一下嗎? – FrozenHeart

+0

Nikki回答了技術原因。考慮縮小代碼的最簡單方法是:儘可能用最短的非人類可讀標識符替換所有長變量和函數名稱。 Minifiers並沒有真正改變代碼的結構......它們只是縮小了代碼量(很像英語使用縮寫詞來縮短長句)。這樣可以減少代碼的文件大小,從而可以通過網絡更快地傳輸文件。 –

回答

4

縮小處理使所有名稱和函數的參數縮短以減少文件的權重。所以,一旦你的控制器越來越精縮,他會是這樣的:

function(a, b, c, d) { /* ... */ }]);

但是,如果你正在使用$inject,或通過與功能注射的陣列,它會讓你的函數知道確切服務應注射到每個的參數到您的控制器中。

app.controller('LoginCtrl', [ 
'$scope', '$rootScope', '$http', '$location', 
function(a, b, c, d) { /* ... */ }]); 

所以一旦將被精縮角度將仍然應該被注射服務和位置編號(在數組元素的索引)的名稱它們中的每鏈接到在控制器功能參數的索引。所以,正如我們看到的,訂單事宜

+0

你確定嗎?我認爲我們可以重新排序這些函數的參數,而不必更新數組中的元素 – FrozenHeart

+0

請查看文檔 - https://docs.angularjs.org/guide/di。它表示,「$ inject數組中的值的排序必須與MyController中的參數的排序相匹配」,僅限於「$ inject Property Annotation」。對於「內聯數組註記」,它只是說「注意保持註釋數組與參數在函數聲明中同步」。我認爲這意味着我們只需要傳遞與數組中相同數量的參數 – FrozenHeart

+0

@FrozenHeart不,你不能。請參閱[this](http://stackoverflow.com/q/29868888/) –

相關問題