鍍金池/ 問答/HTML5  HTML/ angularjs里$scope,$rootScope等名字為什么不能變?

angularjs里$scope,$rootScope等名字為什么不能變?

請教一個問題:

angularjs里我們常常會寫這樣的代碼

app.controller("ctrl", function ($scope, $rootScope, $http) {
    // do something with $scope, $rootScope, $http
});

但是為什么$scope$http等的名字是不能變的呢?就是說為什么我不能寫成這個樣子:

app.controller("ctrl", function ($fakeScope, $fakeRootScope, $fakeHttp) {
    // do something with $fakeScope, $fakeRootScope, $fakeHttp
});

甚至是這樣:

app.controller("ctrl", function (fakeScope, fakeRootScope, fakeHttp) {
    // do something with fakeScope, fakeRootScope, fakeHttp
});

都是不行的。

以及,angularjs是如何判斷我傳的參數(shù)的順序的(比如為什么我傳的第一個就是$scope而不是$rootScope)?

回答
編輯回答
夢若殤

你沒有使用依賴注入

2017年5月24日 21:47
編輯回答
愛礙唉

天生如此。

2017年1月19日 15:05
編輯回答
薔薇花

我是這樣理解這個問題的。

如果按照你的寫法,一般意義上來講,function中傳參,參名改成其他的也是可行的。

但是你可能忽略了, 你沒有按照嚴格的寫法來寫這段依賴注入。比如你的示例,完整應該這樣寫

app.controller("ctrl", ['$scope','$rootScope', '$http',function ($scope, $rootScope, $http) {
    // do something with $scope, $rootScope, $http
}]);

也就是說,你函數(shù)當中的參數(shù),已經(jīng)被你的依賴注入,“固定”好了,這也順便回答了你angularjs是如何判斷我傳的參數(shù)的順序的。就是通過依賴注入,來確定你的參數(shù)順序的,而這些“實際存在的工作”被你省略了。

2017年7月30日 04:18
編輯回答
替身

框架內(nèi)置的,為何在使用時 你再起個名字?出于什么目的呢。。完全沒道理啊?。?br>依賴注入,從ng1.x就有,有空你再用用ng2.x 就更能體會依賴注入的特性。
至于依賴注入時,注入的參數(shù)順序問題,我個人認為這個和JS里的arguments特性很類似,可以再去看看arguments相關的內(nèi)容,這樣就比較好理解。使用時也不會太糾結;個人在使用NG1的時候依賴注入($scope、$http$filter以及自定義的vlaue、service等)時并沒有可以去關注傳參順序,通過gulp等壓縮混淆后也沒有任何問題。

2018年5月10日 17:29
編輯回答
厭惡我

這就取決于angular的依賴注入實現(xiàn)了,采用Function.prototype.toString將函數(shù)轉為string,分析里面的參數(shù)名稱,執(zhí)行時將這些服務作為參數(shù)傳遞進來就行了

function injector(fakeScope) {}
injector.toString()
// output: 
// "function injector(fakeScope) {}"

所以,這就是不行的原因了。
但是你這樣寫是有限制的,如果使用了代碼混淆,參數(shù)名可能變成這樣

function injector(a) {}

所以,正經(jīng)的寫法按照前幾位回答的寫就行了,injector作為一個array,依賴從array的slice(0, -1)中取。

2018年1月25日 07:14
編輯回答
膽怯
app.controller("ctrl", ['$scope','$rootScope', '$http',function (fakeScope, fakeRootScope, fakeHttp) {
    // do something with $scope, $rootScope, $http
}]);

這樣寫名字就可以隨便怎么變

2018年8月17日 14:29