AngularJS控制器:将公共代码移动到单独的文件

AngularJS控制器:将公共代码移动到单独的文件,angularjs,Angularjs,我有一些带有一些通用代码的控制器,特别是对于几个控制器相同的$scope.$watch。如何将此代码放在单独的文件中,并在需要此$watch的各种控制器中导入通用代码?您可以通过进入控制器的作用域来使用服务: angular.module('app').service("CommonFunctions", ['SomeService', function(SomeService) { var commonFunctions = {}; commonFunctions.init =

我有一些带有一些通用代码的控制器,特别是对于几个控制器相同的
$scope.$watch
。如何将此代码放在单独的文件中,并在需要此
$watch
的各种控制器中导入通用代码?

您可以通过进入控制器的作用域来使用服务:

angular.module('app').service("CommonFunctions", ['SomeService', function(SomeService) {
    var commonFunctions = {};
    commonFunctions.init = function(scope){
        scope.$watch(function(){},function(){})
    };
    return commonFunctions;
}]);

angular.module('app').controller('Ctrl1', 
['$scope','CommonFunctions',function($scope,CommonFunctions) {
    CommonFunctions.init($scope);
}]);

angular.module('app').controller('Ctrl2', 
['$scope','CommonFunctions',function($scope,CommonFunctions) {
    CommonFunctions.init($scope);
}]);
这样,您使用的是单个控制器的作用域,但在服务中使用的是公共方法。如果希望从实际添加到控制器作用域的服务中获得公共功能,还可以在控制器中使用
angular.extend($scope,AService)

这是一把正在工作的小提琴:


当然这很酷,但是你确定不想使用
$rootscope.$broadcast()
?这写得很好:

服务可以解决这个问题吗?我很确定服务中的作用域是不可能的…@EricC$scope只是服务函数的一个参数。我不认为扩展$scope有什么意义。你已经有服务了。只要调用
CommonFunctions.init($scope)
你说得对,
extend()
在这种情况下是过分的,因为你不需要$scope中的函数。我已经修改了我的答案。