是否可以将控制器注入另一个属于同一模块的控制器?
示例:
var app = angular.module('myAppModule', [])
.controller('controllerOne', ['$scope', function($scope){
$scope.helloWorld = function(){
return 'Hello World';
}
}])
.controller('controllerTwo', ['$scope', 'controllerOne', function($scope, controllerOne){
console.log(controllerOne.helloWorld());
}])

我一直在controllerOne上获得未知的提供者。我不知道这是可能的,因为它们在同一个模块中共存。任何帮助将不胜感激。
答案 0 :(得分:25)
你需要使用$controller
依赖关系,你可以将一个控制器注入另一个
.controller('controllerTwo', ['$scope', '$controller', function($scope, $controller){
$controller('controllerOne', {$scope: $scope})
//inside scope you the controllerOne scope will available
}]);
但确实更喜欢service/factory
分享数据
答案 1 :(得分:3)
将您的逻辑转移到"服务" (工厂/服务/提供商)。我个人更喜欢工厂,我喜欢控制自己的对象,而不是使用this
或类似的其他选项。
使用服务,您可以从控制器中抽象业务逻辑,并使逻辑 - 可重用 - !
var app = angular.module('myAppModule', [])
// typically people use the word Service at the end of the name
// even if it's a factory (it's all the same thing really...
.factory('sharedService', function () {
var methods = {};
methods.helloWorld = function () {
return 'Hello World!';
};
// whatever methods/properties you have within this methods object
// will be available to be called anywhere sharedService is injected.
return methods;
})
注意 sharedService 已注入
.controller('ControllerOne', ['$scope', 'sharedService', function($scope, sharedService) {
$scope.helloWorld = sharedService.helloWorld();
}])
// Notice sharedService is injected here as well
.controller('ControllerTwo', ['$scope', 'sharedService', function($scope, sharedService){
// Now we can access it here too!
console.log( sharedService.helloWorld() );
}]);
旁注:控制器应大写以显示其重要性!
服务的力量:))
答案 2 :(得分:1)
如果一个controllerTwo需要调用与controllerOne相同的功能,你可能想要创建一个服务来处理它。 Angular Services - 通过依赖注入可以在整个程序中访问它们。
var app = angular.module('myAppModule', [])
.controller('controllerOne', ['$scope', 'Hello', function($scope, Hello){
console.log(Hello.helloWorld() + ' controller one');
}])
.controller('controllerTwo', ['$scope', 'Hello', function($scope, Hello){
console.log(Hello.helloWorld() + ' controller two');
}])
.factory('Hello', [function() {
var data = {
'helloWorld': function() {
return 'Hello World';
}
}
return data;
}]);
希望这有帮助!
答案 3 :(得分:0)
您无法在其他控制器中注入控制器,只有 serviceProviers 可注入。这就是您在控制器1中作为未知提供程序出错的原因。
使用服务代替并将它们注入控制器,如果有一些功能可以在控制器之间共享。服务是在控制器之间共享数据的最佳方式。
您可以在 $ rootScope 上声明变量或函数或说明对象,它在您的整个应用程序中都存在。