Pregunta Usando las mismas funciones en 2 controladores diferentes AngularJS


Estoy tratando de reutilizar algunas funciones más grandes en 3 controladores en Angular JS. No quiero fijar las funciones a mi ámbito raíz, ya que quiero mantenerlas libres de funciones que se usarán solo 3 veces dentro de esos 3 controladores.

    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
        }])

¿Puede decirme cómo puedo lograr eso sin escribir mis funciones en el alcance de la raíz?

Intenté dentro de una fábrica, pero llamar a AdminModule.toLevelKey () no funcionará ...

    .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;
                        }
                    }
                }
            );
        } ]);

5
2018-02-12 10:10


origen


Respuestas:


De acuerdo con el comentario anterior de David Fariña: "¿Hay aún más opciones?".

Excepto ejecución, también puede pasar datos de un controlador a otro y transmitir evento, cuando sucede.

Servicio compartido:

    angular.module("yourAppName", []).factory("mySharedService", function($rootScope){

        var mySharedService = {};

        mySharedService.values = {};

        mySharedService.setValues = function(params){
            mySharedService.values = params;
            $rootScope.$broadcast('dataPassed');
        }

        return mySharedService; 
   });

FirstController:

 function FirstCtrl($scope, mySharedService) {
      $scope.passDataInSharedSevice = function(params){
         mySharedService.setValues(params);
      }
 }

SecondController:

 function SecondController($scope, mySharedService) {
    $scope.$on('dataPassed', function () {
        $scope.newItems = mySharedService.values;
    });
 }

3
2018-02-12 10:24



Esto se puede hacer por un servicio:

.service('myService', function(){
   return {
      fn: function(){
        // do what you want
      }
   }
});

uso:

.controller('ctrl2', ['$scope', 'details', 'myService', 
             function ($scope, details, myService) {
   // use functions
   myService.fn();
}])

10
2018-02-12 10:16