2013-02-12 11 views
15

W niektórych angularjs tutoriale, kątowe aplikacja jest zdefiniowany jako:Jaka jest korzyść z definiowania aplikacji kątowej?

myApp = angular.module("myApp",[]); 

Ale możemy też zrobić bez niego. Jedyna różnica widzę jest, kiedy możemy zdefiniować kontroler, nie możemy wykorzystywać idiom:

myApp.controller("myCtrl",function(){ }) 

ale musi użyć

function myCtrl(){} 

Czy istnieją jakieś inne korzyści definiowania MojaApl wyraźnie, biorąc pod uwagę, że utworzy tylko jedną aplikację dla mojej witryny? Jeśli nie zdefiniuję myApp, to gdzie są moje moduły?

Jeśli jest, jak mogę ponownie utworzyć myApp w testach z Jasminem?

Odpowiedz

34

Można zdefiniować kontrolery w (co najmniej) 3 sposoby:

  1. Określ kontroler w postaci globalny var (przechowywany w obiekcie window)

    function Ctrl() {} 
    

    która jest taka sama jak robi:

    window.Ctrl = function() {} 
    
  2. Utwórz moduł i używać wracającą wystąpienie do tworzenia nowych kontrolerów:

    var app = angular.module('app', []); 
    app.controller('Ctrl', function() {}); 
    
  3. Utwórz kontrolery bezpośrednio na module bez zapisywania żadnych odniesień (tak samo, jak 2, ale bez użycia vars):

    angular.module('app', []); 
    angular.module('app').controller('Ctrl', function() {}); 
    

Z punktu kątowym widzenia, wszyscy robią to samo, można nawet mieszać je ze sobą i będą działać.Jedyną różnicą jest to, że opcja 1 używa globalnych zmiennych, podczas gdy w opcjach 2 i 3 kontrolery są przechowywane wewnątrz prywatnego obiektu Angula.

+0

Wielkie dzięki za bardzo jasną odpowiedź! – AdamNYC

+0

Możesz również dołączyć "usługi", "dyrektywy", ... – EpokK

-3

musisz mimo to zdefiniować aplikację z angular.module. myApp.controller i funkcja myCtrl są takie same ..

+0

Witam Gal, popraw mnie, jeśli się mylę, ale nie sądzę, że musisz zdefiniować aplikację, aby zdefiniować moduł. Możesz po prostu użyć 'angular.module ('mójModuł, [])'. Zobacz na przykład http://docs.angularjs.org/tutorial/step_11 – AdamNYC

+0

musisz utworzyć moduł z nazwą aplikacji, inaczej ng-app da błąd. –

+0

@ GalBen-Haim, niekoniecznie. Zobacz moją odpowiedź bez zdefiniowanej 'ng-app'. –

4

Rozumiem, skąd przybywasz, ponieważ wyjaśnienie ładowania twojego Angula jest wszędzie. Grając z Angularem tylko przez miesiąc (podzielę się tym, co wiem), widziałem, jak masz to zdefiniowane powyżej. Byłem również w tym samym scenariuszu, w którym muszę tylko raz zdefiniować myApp i nie mieć wielu.

Alternatywnie można zrobić coś takiego poniżej. Zauważysz, że Angular app i controller nie muszą żyć tym samym namespace. Myślę, że to bardziej dla czytelności i organizacji niż cokolwiek innego.

JS:

window.app = {}; 
/** Bootstrap on document load and define the document along with 
     optional modules as I have below. 
*/ 
angular.element(document).ready(function() { 
    app.ang = angular.bootstrap(document, ['ngResource', 'ngSanitize']); 

    // OR simply, works similarly. 
    // angular.bootstrap(document, []); 

}); 

/** Define Angular Controller */ 
app.myController= function ($scope, $resource, $timeout) { 

}; 

HTML:

<div role="main" ng-controller="app.myController"></div> 
Powiązane problemy