我是使用角度js的新手,我已经声明了许多控制器,现在我想将一个控制器的功能用于另一个控制器。这是我的示例代码。
app.controller('Controller1',function($scope,$http,$compile){
$scope.test1=function($scope)
{
alert("test1");
}
});
app.controller('Controller2',function($scope,$http,$compile){
$scope.test2=function($scope)
{
alert("test1");
}
});
app.controller('Controller3',function($scope,$http,$compile){
///
});
现在我想在controller3中调用test2函数。 任何人都可以帮忙.. 感谢Avance ...:)
答案 0 :(得分:13)
您无法从控制器内的控制器调用方法。您需要提取方法,创建服务并调用它。这也将使代码彼此分离并使其更易于测试
(function() {
angular.module('app', [])
.service('svc', function() {
var svc = {};
svc.method = function() {
alert(1);
}
return svc;
})
.controller('ctrl', [
'$scope', 'svc', function($scope, svc) {
svc.method();
}
]);
})();
答案 1 :(得分:4)
最好的方法是编写服务并在两个控制器中使用该服务。请参阅文档Service documentation
如果您真的想从另一个控制器访问控制器方法,请按照以下选项: 在范围上发出事件:
function FirstController($scope) { $scope.$on('someEvent', function(event, args) {});}
function SecondController($scope) { $scope.$emit('someEvent', args);}
答案 2 :(得分:0)
控制器是一个构造函数,如果例如在指令中使用它将创建一个新实例。
你仍然可以做你想要的,假设你的控制器在同一范围内,只需这样做:
请注意,它们必须位于相同范围中,如果未隔离子范围,则仍然可以正常工作。 该指令的定义:
{
controller: Controller1,
controllerAs: 'ctrl1',
link: function($scope) {
$scope.ctrl1.test1(); // call a method from controller 1
$scope.ctrl2.test2(); // created by the directive after this definition
$scope.ctrl3.test3(); // created by the directive after this definition
}
}
....
{
controller: Controller2,
controllerAs: 'ctrl2',
link: function($scope) {
$scope.ctrl1.test1(); // created earlier
$scope.ctrl2.test2(); // ...
$scope.ctrl3.test3(); // created by the directive after this definition
}
}
....
{
controller: Controller3,
controllerAs: 'ctrl3',
link: function($scope) {
$scope.ctrl1.test1();
$scope.ctrl2.test2();
$scope.ctrl3.test3();
}
}
这应该有用。