Javascript 在两个不同的控制器AngularJS中使用相同的函数
我试图在Angular JS的3个控制器上重用一些更大的函数。我不想将函数固定到我的根作用域,因为我想让它远离在这3个控制器中只使用3次的函数Javascript 在两个不同的控制器AngularJS中使用相同的函数,javascript,angularjs,controller,Javascript,Angularjs,Controller,我试图在Angular JS的3个控制器上重用一些更大的函数。我不想将函数固定到我的根作用域,因为我想让它远离在这3个控制器中只使用3次的函数 angular.module('adminModule', ['adminDependency']) .controller('ctrl1', ['$scope', 'details', function ($scope, details) { // use functions }])
angular.module('adminModule', ['adminDependency'])
.controller('ctrl1', ['$scope', 'details', function ($scope, details) {
// use functions
}])
.controller('ctrl2', ['$scope', 'details', function ($scope, details) {
// use functions
}])
.controller('ctrl3', ['$scope', 'details', function ($scope, details) {
// use functions
}])
您能告诉我如何在不将函数写入根范围的情况下实现这一点吗
在工厂内尝试过,但调用AdminModule.toLevelKey()无效
.factory('AdminModule',
[ '$resource', 'serviceURL', function ($resource, serviceURL) {
return $resource(serviceURL + 'class/:id', {
id : '@id'
}, {
getClasses : {
method : 'GET',
url : serviceURL + 'extended/class',
isArray : true
},
toLevelKey : function (value) {
var return_key = parseInt(Math.floor(value / 3));
var return_level = value % 3;
return { level : return_level + 1, levelTranslationKey : return_key + 1 };
},
fromLevelKey : function (level, key) {
if (angular.isDefined(level)) {
var value = (key - 1) * 3 + (level - 1);
return value;
} else {
return null;
}
}
}
);
} ]);
这可以通过以下服务完成:
.service('myService', function(){
return {
fn: function(){
// do what you want
}
}
});
用法:
.controller('ctrl2', ['$scope', 'details', 'myService',
function ($scope, details, myService) {
// use functions
myService.fn();
}])
根据David Fariña的上述评论:“还有更多的选择吗?” 除了执行,您还可以将数据从一个控制器传递到另一个控制器,并在事件发生时广播事件 共享服务:
angular.module("yourAppName", []).factory("mySharedService", function($rootScope){
var mySharedService = {};
mySharedService.values = {};
mySharedService.setValues = function(params){
mySharedService.values = params;
$rootScope.$broadcast('dataPassed');
}
return mySharedService;
});
第一控制器:
function FirstCtrl($scope, mySharedService) {
$scope.passDataInSharedSevice = function(params){
mySharedService.setValues(params);
}
}
function SecondController($scope, mySharedService) {
$scope.$on('dataPassed', function () {
$scope.newItems = mySharedService.values;
});
}
第二控制器:
function FirstCtrl($scope, mySharedService) {
$scope.passDataInSharedSevice = function(params){
mySharedService.setValues(params);
}
}
function SecondController($scope, mySharedService) {
$scope.$on('dataPassed', function () {
$scope.newItems = mySharedService.values;
});
}
这似乎是一个很好的解决方案。还有更多的选择吗?你可以使用工厂。但原则是一样的;特别是当你需要其他服务的时候。在这种情况下,您可以轻松地注入它们。万一您需要设置一些参数以获取详细信息,您应该使用提供程序。我确实需要传递参数。我试图将服务函数分配给作用域,但不知何故调用AdminService.func(param1,param2)无效。抛出了一个错误。编辑:我在一家工厂里用过它,有可能吗?请显示更多的细节(代码)你正在尝试做什么。下行投票者能告诉我这有什么问题吗?@DavidFariña,我想,下行投票者的意思是,答案与问题不对应。我在你的评论中添加了这个答案:“还有更多的选择吗?”答案中没有任何错误。实际上,我是这样做的,因为我无法在需要的地方注入服务。谢谢