javascript - angularjs怎么知道回調(diào)函數(shù)里需要什么參數(shù)?
問(wèn)題描述
例如這樣
app.controller(’myCtrl’, function($scope, $rootScope) { // 將$rootScope改成其他名字就不行了。 $scope.names = ['Emil', 'Tobias', 'Linus']; $rootScope.lastname = 'Refsnes';});
angular是怎么知道我第二個(gè)參數(shù)需要$rootScope?
問(wèn)題解答
回答1:因?yàn)?AngularJS 提供兩種注入方式。一種叫 implicit dependency injection(隱式依賴注入),一種叫 explicit dependency injection(顯式依賴注入)。
你的代碼中,使用的是第一種,隱式依賴注入:
app.controller(’myCtrl’, function($scope, $rootScope) { $scope.names = ['Emil', 'Tobias', 'Linus']; $rootScope.lastname = 'Refsnes';});
由于 $scope 和 $rootScope 都是 AngularJS 的 built-in service,因此 AngularJS 可以找到你想要注入的東西。但如果你改成 rootScope,這樣 AngularJS 就從自己的框架中找不到了。
如果使用顯式依賴注入,就是這樣:
app.controller(’myCtrl’, [’$scope’, ’$rootScope’, function(whatever, blah) { whatever.names = ['Emil', 'Tobias', 'Linus']; blah.lastname = 'Refsnes';}]);
這樣 AngularJS 就會(huì)根據(jù)顯式聲明的 $scope 和 $rootScope 去找。那么你在匿名函數(shù)的參數(shù)里,設(shè)置成什么都沒(méi)關(guān)系。注意先后順序就好。
或者,你也可以通過(guò)手動(dòng)調(diào)用 $inject 來(lái)實(shí)現(xiàn)。就像這樣:
var myController = function($scope, $rootScope) { $scope.names = ['Emil', 'Tobias', 'Linus']; $rootScope.lastname = 'Refsnes';});myConroller.$inject = [’$scope’, ’$rootScope’];app.controller(’myCtrl’, myController);
詳情請(qǐng)參考文檔:https://docs.angularjs.org/gu...Dependency Annotation 那一部分。
文檔中同樣提醒了你,如果你打算壓縮代碼,那就不要使用隱式依賴注入。
相關(guān)文章:
1. node.js - vue搭建環(huán)境- vue init webpack my-project無(wú)響應(yīng)2. css3的復(fù)雜動(dòng)畫轉(zhuǎn)成jquery調(diào)用怎么寫3. html5 - 這個(gè)代碼顯示功能如何實(shí)現(xiàn)?4. javascript - Vue2 指令的優(yōu)先級(jí)如何設(shè)置?5. javascript - superagent爬取網(wǎng)站出現(xiàn)重定向問(wèn)題6. javascript - 為什么使用art-template后,模板里面讀取不到數(shù)據(jù)的長(zhǎng)度7. node.js - windows中C#開發(fā)的程序,怎么放在java的linux服務(wù)器端運(yùn)行8. javascript - 微信小程序不支持<br> <p>等標(biāo)簽9. ruby-on-rails - Ruby:使用rails server啟動(dòng)webrick服務(wù)器的時(shí)候會(huì)報(bào)錯(cuò):Could not find a JavaScript runtime10. node.js - 微信小程序websocket連接問(wèn)題
