2013-12-18 15 views
42

Ich habe Code-Snippets, in denen es einen eckigen modularen Controller gibt, aber es gibt eine Funktion innerhalb des gleichen Controllers und mit einem Anruf, was Zweifel in mir aufkommen lässt, dass diese Art des Codierens erlaubt ist Javascript oder eckig? Wenn ja, wie liest es es? Siehe unten stehende Code-Format Ich habe:Funktion innerhalb des AngularJS Controllers

obj.controller('CartController',function($scope){ 

    $scope.totalCart = function(){ 
    var total = 10;  
    return total; 
    } 
    function calculate(){ 
    ...Some Logic.. 
    } 

    $scope.$watch($scope.totalCart, calculate); 
)}; 

Bitte helfen Sie mir zu verstehen, dass diese Art der Funktionsdefinition ist und rufen Sie in einem Controller erlaubt in Angular/Javascript?

Antwort

68

Die calculate() eine private Funktion ist - es ist im Rahmen von CartController nur zugänglich. Wenn Sie Ihre Funktion nicht in der Ansicht verwenden müssen, sollten Sie sie privat machen. Es sagt, dass es ist nicht beabsichtigt, in der Ansicht verwendet werden, wenn jemand anderes mit diesem Code arbeiten wird, sollte zweimal überlegen, bevor Sie es in der Ansicht verwenden. Außerdem: Von calculate haben Sie Zugriff auf alle Objekte, auf die im Rahmen der CartController zugegriffen werden kann (einschließlich Objekte, die als Parameter an CartController übergeben werden).

Funktion auf diese Weise deklariert ist eine ordnungsgemäße JS function, was bedeutet, dass Sie Verweis auf es durch seinen Namen erhalten können. Manchmal ist es gedacht, um besser lesbar, wenn Sie deklarieren/erstellen Sie Ihre Funktion im Voraus und nur dann ordnen sie Eigenschaften eines anderen Objekts (in diesem Fall $scope):

function someFn (...) { ... } 

function someOtherFn (...) { ... } 

... 

$scope.someFn = someFn 

In dem obigen Schnipsel die Absichten sehr sind clear: make someFn zugänglich, während someOtherFn privat halten.

Btw. deklarierende Funktionen wie: function nameFn(...){...} heißt Funktionsanweisung; Sie können es sehr ähnlich tun: var nameFn = function(...) {...} (so genannte Funktion Ausdruck). Es gibt einen kleinen Unterschied zwischen denen - im Grunde ist es illegal:

someFn(); 
var someFn = function(...) {...} 

während dies funktioniert:

someFn(); 
function someFn(...) {...} 

Manchmal sind Sie gezwungen, dieses Muster zu verwenden, suchen z.B. bei meinem answer zu diesem question.

+0

Ausgezeichnete Beschreibung – Padyster

1

Die Definition ist erlaubt, hat es die gleichen Auswirkungen auf wie

$scope.$watch($scope.totalCart, function(){..some logic...}) 
4
$scope.launch = function (which) { 

}; 
var _func = function() {...} 
Verwandte Themen