天天看點

angular中的$controller服務

大家一般用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

  1. // 建立myModule子產品、注冊服務    
  2. var myModule = angular.module('myModule', []);    
  3. myModule.service('myService', function() {    
  4.             this.my = 0;    
  5. });    
  6. // 擷取injector    
  7. var injector = angular.injector(["myModule"]);    
  8. // 第一種inference(推斷)  
  9. injector.invoke(function(myService){alert(myService.my);});    
  10. // 第二種annotation (注入)  
  11. function explicit(serviceA) {alert(serviceA.my);};    
  12. explicit.$inject = ['myService'];    
  13. injector.invoke(explicit);    
  14. // 第三種inline  (内聯)  
  15. injector.invoke(['myService', function(serviceA){alert(serviceA.my);}]);    

摘自:探究Angular依賴注入對象$injector