2014-02-12 18 views
5

Ich versuche, ein paar größere Funktionen über 3-Controller in Angular JS wiederzuverwenden. Ich möchte die Funktionen nicht an meinen Root-Bereich anheften, da ich sie von Funktionen, die nur 3-mal innerhalb dieser 3 Controller verwendet werden, freihalten möchte.Mit gleichen Funktionen in zwei verschiedenen Controllern AngularJS

Können Sie mir sagen, wie ich das erreichen kann, ohne meine Funktionen in den Stammbereich zu schreiben?

es in einer Fabrik versucht, aber Aufruf AdminModule.toLevelKey() wird nicht funktionieren ...

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

Antwort

2

In Übereinstimmung mit dem obigen Kommentar von David Fariña: "Gibt es noch mehr Optionen?".

Außer der Ausführung können Sie auch Daten von einem Controller zu einem anderen übertragen und ein Ereignis übertragen, wenn dies geschieht.

SharedService:

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; 
    }); 
} 
+0

Kann der Downvoter bitte sagen, was falsch ist? –

+1

@ DavidFariña, ich denke, dass Downvoter bedeutet, dass die Antwort nicht Frage entspricht. Ich füge diese Antwort zu deinem Kommentar hinzu: "Gibt es noch mehr Optionen?" Die Antwort enthält nichts falsch. –

+0

Ich habe es tatsächlich so gemacht, weil ich nicht in der Lage war, den Dienst dorthin zu bringen, wo ich es brauchte. Vielen Dank –

10

Dies kann durch einen Dienst getan werden:

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

Nutzung:

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

Scheint wie eine sehr gute Lösung. Gibt es noch mehr Möglichkeiten? –

+0

können Sie eine Fabrik verwenden. aber das Prinzip ist dasselbe; vor allem, wenn Sie andere Dienste in Ihrer Funktion benötigen. In diesem Fall können Sie sie leicht injizieren. – michael

+0

Nur für den Fall, dass Sie einige Parameter für Details festlegen müssen, sollten Sie einen Anbieter verwenden. – Whisher

Verwandte Themen