2016-07-01 13 views
0

weitergibt Innerhalb des Controllers versuche ich, meinen Code in benannte Funktionen für die Lesbarkeit zu zerlegen. In den parametrisierten benannten Funktionen sind der Bereich und die injizierte Abhängigkeit jedoch alle null. Wie greifen Sie auf diese innerhalb der genannten Funktionen zu. Danke für deine Hilfe.angularjs wie man Parameter an benannte Funktion vom Controller

(
 
    function() { 
 
    'use strict'; 
 

 
    var moduleName = 'ufsrAppModule'; 
 
    var controllerName = 'ufsrController'; 
 
    var dependencyInjection = ['api', 'appHost', 'userAccount', 'userProfileFactory', 'fsrFactory', 'userFsrFactory', internalFunc]; 
 

 
    angular.module(moduleName) 
 
     .controller(controllerName, dependencyInjection); 
 

 
    function internalFunc(api, appHost, userAccount, userProfileFactory, fsrFactory, userFsrFactory) { 
 

 
     var vm = this; //controller AS in ng-controller, do not use $scope 
 

 
     init(api, appHost, userAccount, userProfileFactory, fsrFactory, userFsrFactory, vm); 
 
    } 
 

 
    function init(api, appHost, userAccount, userProfileFactory, fsrFactory, userFsrFactory, vm) { 
 

 
     vm.facilityChanged = facilityChanged; 
 

 
     ... 
 
     ... 
 

 
     function facilityChanged(vm, fsrFactory) { 
 
     /*update UI then retrieve services*/ 
 
     vm.postStatus = undefined; 
 
     vm.services = undefined; 
 
     vm.roles = undefined; 
 
     vm.services = fsrFactory.service().query({ 
 
      /*parameters*/ 
 
      FacilityID: vm.facility 
 
      }) 
 
      .$promise.then(
 
      function(data) { 
 
       vm.services = data; 
 
      }); 
 
     } 
 
    } 
 
    })();

+0

Wir haben keine Ahnung, wie 'internalFunc' genannt wird, aber wenn es der' this' innerhalb dieser Funktion bezieht sich nicht auf den Umfang des Controllers. Sie können dies überprüfen, indem Sie eine 'console.log (this);' als erste Zeile in 'internalFunc' hinzufügen und die Ausgabe in der Konsole untersuchen. Ich vermute, dass die Ausgabe überhaupt nicht das ist, was Sie erwarten. Die – Lex

+0

interFunc ist eine Abkürzung I als das letzte Element in dem Array erzeugt, dass der zweite Parameter des Konstruktors der Steuerung. Anstatt nach dem abschließenden "]" am fernen Ende des Controller-Konstruktors zu suchen, wird das ordnungsgemäße Schließen des Annotationsarrays sichergestellt. Es ist ein Stil, den ich von John Papas Angular Style Guide übernommen habe. In console.log() hat alles wie erwartet funktioniert. – user266909

Antwort

0

Strict DI können separat in diesem Stil

angular.module(moduleName) 
     .controller(controllerName, controllerFunction); 

controllerFunction.$inject = ['$scope', '$http']; 

function controllerFunction($scope, $http) { 
    ... 
} 

Dieser Stil auch von John Papa's Angular style guide empfohlen erfolgen wird.

+0

Danke für den Vorschlag. Mein Stil funktioniert auch, außer wenn ich versuchte, den Körper von nicht benannten Funktionen in benannte Funktionen zu verschieben. Die an die genannten Funktionen übergebenen Parameter sind immer null. Vielen Dank. – user266909

0

Die facilityChanged funktioniert nicht, weil seine Parameter diejenigen sind, zu überschreiben, die in init

übergeben werden kann es durch

Ändern
function facilityChanged() { 

bearbeiten

function facilityChanged(vm, fsrFactory) { 

zu

festgesetzt: Angebracht jsbin

Ich empfehle dringend die init Funktion in Ihrer Controller-Funktion zu speichern, um die Parameter zu übergeben, genau wie die activate Funktion in John Papa's Guide.

Refined jsbin

+0

Danke. Es funktioniert nicht mit facilityChanged(). Die Konsole zeigt ReferenceError: 'vm' ist nicht definiert. Der im Controller erstellte vm scheint für die benannte Funktion nicht sichtbar zu sein. – user266909

+0

@ user266909 Angehängtes Beispiel und empfohlener Stil – Icycool

Verwandte Themen