2014-09-19 75 views
8

我有一些控制器与一些公用代码,具体来说$scope.$watch是几个控制器相同。我怎样才能把这个代码放在一个单独的文件中,并在需要这个$watch的各种控制器中导入公共代码?AngularJS控制器:将公共代码移动到单独的文件

+0

可以为此服务吗? – worldask 2014-09-19 15:45:49

+0

我很确定服务范围是不可能的...... – EricC 2014-09-19 15:49:14

+0

@EricC $ scope只是一个服务函数的参数。 – cgTag 2014-09-19 16:20:14

回答

7

可以通过传递您的控制器的范围内使用服务:

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)

这里的工作小提琴http://jsfiddle.net/rhcjdb7L/

肯定这是非常冷静和所有,但你确定你不想使用$rootscope.$broadcast()?这是写得很好:http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

+0

我没有看到扩展$范围的要点。你已经有一个服务。只需调用'CommonFunctions.init($ scope)' – cgTag 2014-09-19 16:21:49

+0

你是对的,'extend()'在这种情况下是矫枉过正的,因为你不需要$ scope中的那个函数。我修改了我的答案。 – 2014-09-19 16:35:04

+0

谢谢你们:) – EricC 2014-09-19 17:47:10

相关问题