Angularjs docs将$ controller服务的用法表示为:
$controller(constructor, locals);
任何人都可以关注这两点:
答案 0 :(得分:14)
您可以创建要在$ scope上执行的公共函数到一个控制器中,可以命名为'CommonCtrl'
。
angular.module('app',[]).controller('CommonCtrl', ['$scope', function($scope){
var self = this;
$scope.stuff1 = function(){
}
$scope.stuff2 = function(){
}
self.doCommonStuff = function(){
// common stuff here
$scope.stuff1();
$scope.stuff2();
};
return self;
}]);
然后将此控制器注入其他控制器,让我们说“TestCtrl1'像
angular.module('app',[]).controller('TestCtrl1', ['$scope','$controller', function($scope, $controller){
var commonCtrl = $controller('CommonCtrl',{$scope: $scope}); // passing current scope to commmon controller
commonCtrl.doCommonStuff();
}]);
这里,在$ controller service的第二个参数中,我们传递了CommonCtrl所需的依赖项。因此doCommonStuff方法将使用TestCtrl1控制器的范围。
答案 1 :(得分:3)
简而言之,它在单元测试期间创建目标控制器很有用。
假设您有一个带有签名.controller('MainCtrl', function($scope, serviceA){..})
的控制器。
在测试中,
// ...
beforeEach(inject(function ($rootScope, $controller, serviceA) {
// assign injected values to test module variables
scope = $rootScope.$new();
service = serviceA
// create the controller, by passing test module variables values as dependencies
$controller('MainCtrl', {'$scope': scope, 'serviceA': service});
}));
it('test on controller', function() {
//...
});
答案 2 :(得分:0)
您还可以使用此服务来实现控制器继承。
angular.module('app',[]).controller('BaseCtrl', ['$scope', function($scope){
$scope.action1 = function(){
console.log('In BaseCtrl action1');
}
$scope.action2 = function(){
console.log('In BaseCtrl action2');
}
}]);
angular.module('app').controller('ChildCtrl', ['$scope', function($scope){
angular.extend(this, $controller('BaseCtrl', {
$scope: $scope
}));
$scope.action1 = function(){
console.log('Overridden in ChildCtrl action1');
}
$scope.action2 = function(){
console.log('Overridden in ChildCtrl action2');
}
}]);