2016-05-21 30 views
1

我有這個控制器A,我試圖注入每個其他控制器。 就是控制器A呢,它有一個工廠通信(其中做一些認證服務,與數據庫通信)Angularjs:注入一個控制器在另一個失敗

我廠是這樣的,我把它命名爲myFactoryServices.js和包含在我的索引頁的鏈接。

(function() { 

angular 
.module('myApp.myFactoryServices', []) 

.factory('FactoryService', ["$http", "$location", function($http, $location){ 
    var my = this; 
    my.someFunction = function() 
    { 
     //communiate with backend and return data 
    } 
    return my; 
}]); 

})(); 

和我的控制器A是這樣的:

(function() { 

    angular 
     .module('myApp.ControlA', []) 

     .controller('ControllerA', function($scope,$routeParams, FactoryService) { 
      var my = this;  
      FactoryService.someFunction(); 

     }); 
})(); 

,我試圖注入該控制器在所有其他的控制器,但它不工作。我對這種編程很新,誰能告訴我我犯了什麼錯誤?

這是我試過注射控制器到另一個。

(function() { 

    angular 
     .module('myApp.ControlB', []) 

     .factory('ControllerBService', function($http) { 
      var baseUrl = 'backendurl/'; 
      return { 
       getInfo: function() { 
        return $http.get(baseUrl+ 'getInfo'); 
       } 
      }; 
     }) 

     .controller('ControllerB', function($scope,$routeParams, ControllerBService,ControllerA) { 
       var my = this;  

     }); 
})(); 

沒有錯誤,並且控制器沒有被注入,因爲我無法使用這些工廠服務。這是正確的方法嗎?

+0

Cotnrollers不可注射。如果你想分享一些行爲,請使用服務/工廠。 – sielakos

回答

2

首先你不能注入控制器到另一個控制器,和一個簡單的解決辦法是,代替具有用於每個組件的每個角模塊,聲明一個模塊和作爲依賴添加工廠服務控制器。

代碼:

var app = angular.module('myApp', []); 
app.factory('FactoryService', ["$http", "$location", function($http, $location){ 
    var my = this; 
    my.someFunction = function() 
    { 
     //communiate with backend and return data 
    } 
    return my; 
}]); 

app.controller('ControllerA', function($scope,$routeParams, FactoryService) 
{ 
    var my = this;  
    FactoryService.someFunction(); 

}); 

app.controller('ControllerB', function($scope,$routeParams, FactoryService) 
{ 
    var my = this;  
    FactoryService.someFunction(); 
}); 
0

控制器不注射,因爲控制器不是單例。控制器是用於創建控制器實例的構造函數。例如,你可以有一個控制器的多個實例在您的應用程序:

angular.module('app', []); 
 

 
angular 
 
    .module('app') 
 
    .controller('Example', function() { 
 
    this.x = Math.random(); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.js"></script> 
 
<div ng-app="app"> 
 
    First instance: <br> 
 
    <div ng-controller="Example as Ex1"> 
 
    {{Ex1.x}} 
 
    </div> 
 
    Second instance: <br> 
 
    <div ng-controller="Example as Ex2"> 
 
    {{Ex2.x}} 
 
    </div> 
 
</div>

所以,如果你想分享控制器,你應該使用,而不是工廠之間的一些行爲。

0

爲了注射控制器到另一個控制器,使用$controller服務。

app.controller('ControllerB', function($scope,$routeParams, $controller) { 
     var my = this; 
     $scope.ctrlA = $controller("ControllerA", {$scope: $scope});  

}); 

上面的例子與父控制器的範圍注入其$scope創建的ControllerA as ctrlA一個實例。

欲瞭解更多信息,請參閱AngularJS $controller Service API Reference

相關問題