我有这个控制器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;
});
})();
没有错误,控制器没有被注入,因为我无法使用这些工厂服务。这是正确的方法吗?
答案 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)
控制器不可注入,因为控制器不是单例。控制器是用于创建控制器实例的构造函数。例如,您可以在应用中拥有一个控制器的多个实例:
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;
因此,如果你想在控制器之间分享一些行为,你应该使用工厂。
答案 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。