大家一般用angular的$controller的時候都是用如下的方式:
angular.module('app',[])
.controller('appController',function{})
這樣的方式是讓angular自動去尋找程式的入口ng-app,然後自動解析依賴注入,并且聲成執行個體。
其實在angular内部執行過程如下
//使用注射器加載應用
var injector=angular.injector(['ng','app']);
//通過注入器加載$controller服務
var $controller=injector.get('$controller');
var scope=injector.get('$rootScope').$new();
//加載控制器并傳入一個作用域,同angular在運作時的一樣
var myController=$controller('appController',{$scope:scope})
這種是通過顯式的注入聲明了依賴關系。
連結:http://www.jianshu.com/p/9ba5761468aa
angular中三種聲明依賴的方式
在我們使用.controller()函數的時候,會調用$controller服務,而在底層,則将使用$injector服務的invoke()函數建立該控制器,函數invoke()将負責分析什麼參數需要被傳入controller中,并執行該函數,是以底層實際上是使用了以下三種方式聲明依賴。 [javascript] view plain copy
- // 建立myModule子產品、注冊服務
- var myModule = angular.module('myModule', []);
- myModule.service('myService', function() {
- this.my = 0;
- });
- // 擷取injector
- var injector = angular.injector(["myModule"]);
- // 第一種inference(推斷)
- injector.invoke(function(myService){alert(myService.my);});
- // 第二種annotation (注入)
- function explicit(serviceA) {alert(serviceA.my);};
- explicit.$inject = ['myService'];
- injector.invoke(explicit);
- // 第三種inline (内聯)
- injector.invoke(['myService', function(serviceA){alert(serviceA.my);}]);
摘自:探究Angular依賴注入對象$injector