Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在两个不同的控制器AngularJS中使用相同的函数_Javascript_Angularjs_Controller - Fatal编程技术网

Javascript 在两个不同的控制器AngularJS中使用相同的函数

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 JS的3个控制器上重用一些更大的函数。我不想将函数固定到我的根作用域,因为我想让它远离在这3个控制器中只使用3次的函数

    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,我想,下行投票者的意思是,答案与问题不对应。我在你的评论中添加了这个答案:“还有更多的选择吗?”答案中没有任何错误。实际上,我是这样做的,因为我无法在需要的地方注入服务。谢谢