Angularjs:在另一个控制器中注入一个控制器失败

时间:2016-05-21 08:34:22

标签: angularjs

我有这个控制器A,我试图在其他所有控制器中注入。 控制器A做的是,它与工厂(它做一些认证服务,与数据库通信)进行通信

我的工厂看起来像这样,我把它命名为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;      

        });
})();

没有错误,控制器没有被注入,因为我无法使用这些工厂服务。这是正确的方法吗?

3 个答案:

答案 0 :(得分: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();
});

答案 1 :(得分:0)

控制器不可注入,因为控制器不是单例。控制器是用于创建控制器实例的构造函数。例如,您可以在应用中拥有一个控制器的多个实例:

&#13;
&#13;
angular.module('app', []);

angular
  .module('app')
  .controller('Example', function () {
    this.x = Math.random();
  });
&#13;
<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>
&#13;
&#13;
&#13;

因此,如果你想在控制器之间分享一些行为,你应该使用工厂。

答案 2 :(得分:0)

要将控制器注入另一个控制器,请使用$controller服务。

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

});

上面的示例创建了一个ControllerA as ctrlA实例,其$scope注入了父控制器的范围。

有关详细信息,请参阅AngularJS $controller Service API Reference