2016-04-27 8 views
0

ich vor kurzen Situationen wie diese gesehen habe:private Funktionen Vermeiden von AngularJS Controller undichten

app.controller('MainCtrl', ['$scope', 'MyService', function($scope, MyService) { 
    $scope.name = 'World'; 
    var self = this; 

    $scope.operationOne = function() {   
     MyService.sayHello(); 
     self.someCommonBehaviour(); 
    } 

    $scope.operationTwo = function() {  
     MyService.sayGoodbye(); 
     self.someCommonBehaviour(); 
    } 

    this.someCommonBehaviour = function() { 
    } 
}]); 

Es gibt einige gemeinsame Funktionalität zwischen den Funktionen ist auf den Umfang angebracht, die auf eine Funktion extrahiert wird. Da wir einen Verweis auf den Controller benötigen, um auf 'someCommonBehaviour' zuzugreifen, hängen wir die Funktion an 'this' an und speichern eine Referenz davon in self, so dass wir in den $ scope-Funktionen darauf zugreifen können (dies ist der Gültigkeitsbereich) wenn die Funktion aufgerufen wurde).

Auf Funktionen wie 'someCommonBehaviour' kann von außen zugegriffen werden (ctrl.someCommonBehaviour()). Ich denke, dass, zumindest in den Fällen, die ich gesehen habe, die Absicht klar diese Funktionen als ein privates Anliegen des Controllers verlassen. Die Tatsache, dass sie zugegriffen werden können, ist ein Unfall.

Darüber hinaus habe ich Situationen gesehen, in denen der Programmierer versucht, mehr Logik in einen bereits komplizierten Controller hinzuzufügen, und sie fallen in die Versuchung, diese Funktionen zu testen, was Sie nicht tun sollten.

Ich suche nach einer Möglichkeit zu verhindern, dass diese Funktionen von außen zugegriffen werden.

Ich habe über IIFE nachgedacht, da sie Ihnen erlauben, die Funktionen zu steuern, die die öffentliche API Ihres Moduls definieren (und das ist die Implementierung, die ich für Dienste auswähle). Es fühlt sich seltsam an, dass die einzige API, die ich für diesen Fall verwenden möchte, durch die Funktionen definiert ist, die ich dem Bereich hinzufüge. So hättest du so etwas wie:

Ich denke, es sollte funktionieren, aber es fühlt sich so seltsam an, ein leeres Objekt zurückzugeben.

Fehle ich etwas ?. Was ist der beste Ansatz?

Antwort

6

Nur nicht an this anhängen. Nur der Code im Controller wird es jemals sehen.

app.controller('MainCtrl', ['$scope', 'MyService', function($scope, MyService) { 
    $scope.name = 'World'; 
    var self = this; 

    $scope.operationOne = function() {   
     MyService.sayHello(); 
     someCommonBehaviour(); 
    } 

    $scope.operationTwo = function() {  
     MyService.sayGoodbye(); 
     someCommonBehaviour(); 
    } 

    // Not accessible outside controller 
    function someCommonBehaviour() { 

    } 
}]); 
+0

Vielen Dank. So offensichtlich, wenn Sie die Antwort haben :-). – IoChaos

Verwandte Themen