2013-08-30 10 views
6

Czytałem przez następującej receptury, która pokazuje drogę do napędzania frontend angularjs z backend Google Cloud Endpoints:Jaka jest różnica między init() i window.init()?

https://cloud.google.com/resources/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications

Co nie rozumiem jest dodatek na angularjs i chmura punktów końcowych inicjalizacja. Odpowiednia sekcja jest następujący:

Dodatek: Wskazówki dotyczące angularjs + Chmura Punkty końcowe Inicjowanie Tip # 1: Uważaj na sekwencji inicjalizacji

księgi aplikacja ładuje trzy różne biblioteki JS w następującym sekwencji :

  • angularjs
  • Aplikacja księgę gości
  • Client API Google, whi ch zawiera punkty końcowe funkcjonalności

do tej sekwencji, index.html zawiera następujące <script> tagów w tagu <head> ładowania każdej z bibliotek JS:

<script src="js/angular.min.js"></script> 
<script src="js/guestbook.js"></script> 
<script src="https://apis.google.com/js/client.js?onload=init"></script> 

Po załadowaniu, trzeci biblioteka (Google API Client) wywołuje funkcję inicjującą określoną przez jej parametr "onload". W tej sprawie oczekiwana jest funkcja init() i wywoływana. Tip # 2: Wejdź do światowej angularjs jak najszybciej

W sekwencji inicjalizacji używamy dwie funkcje:

init() function 
window.init() function 

ten init() funkcja jest zdefiniowana w guestbook.js w następujących sposób:

function init() { window.init(); } 

Jak widać powyższy kod, funkcja po prostu wywołuje window.init) function (tj init() funkcja zdefiniowana w globalnym obiektu window) ( i nie robi nic innego. Window.init() jest zdefiniowana w angularjs kontroler następująco:

$window.init= function() { 
    $scope.$apply($scope.load_guestbook_lib); 
}; 

W angularjs, globalny okno obiekt jest dostępny przez „okno” $ notacji która jest opakowaniem dla niego. Najlepszą praktyką w AngularJS jest nie uzyskiwanie bezpośredniego dostępu do obiektu okna w celu poprawy testowalności.

Powodem, dla którego nie chciał wykonać inicjalizację w metodzie pierwszy init() jest tak można umieścić jak najwięcej jak to możliwe kodu w świecie angularjs, takie jak kontrolery, usług i dyrektyw. Dzięki temu możesz wykorzystać pełną moc AngularJS i mieć wszystkie testy jednostkowe, testy integracji i tak dalej.

Wygląda na to, że globalna funkcja init() jest zdefiniowana w zewnętrznym pliku javascript.Ta funkcja init() po prostu wywołuje window.init() (i powinna być wywoływana przez bibliotekę klienta Google po jej załadowaniu). Ale czy nie jest to funkcja window.init(), tylko globalnie zdefiniowana funkcja init()? Czy nie otrzymamy tutaj pętli, dopóki nie zostanie ponownie zdefiniowana window.init() (i tym samym init())?

+1

proszę don polegać na zasobach poza siedzibą. Pokaż kod, o którym mówisz. Zasoby spoza serwisu gniją, a ludzie nie powinni odwiedzać ich, aby ci pomóc. –

Odpowiedz

0

guestbook.js definiuje funkcję init, która pojawia się w Twoim opisie jako globalna. Ta funkcja init jest przekazywana do google client.js. Ta globalna funkcja init wywołuje (inną) funkcję globalną w window.init. Pierwszy załadowany moduł kątowy powinien mieć okno setup.init poprzez kątowe okno $ dostarczone. Nie ma pętli, client.js wywołuje init guestbook.js, który wywołuje metodę kątową $ window.init, która jest taka sama jak window.init.

+0

Nie do końca rozumiem: globalnie zdefiniowana funkcja pojawia się jako właściwość obiektu globalnego, czyli okna. Jak więc mogą istnieć dwie różne funkcje init i window.init? (Tak więc z moim rozumieniem, albo guestbook.js nadpisuje wersję zdefiniowaną w Angularie lub odwrotnie.) – Marc

1

W tym przykładzie podjęta zostanie próba uruchomienia google api init i przeniesienia go do zakresu AngularJS.

Kiedy

<script src="https://apis.google.com/js/client.js?onload=init"></script> 

załadowaniu wywołuje funkcję startowy zdefiniowany globalnie, co z kolei wywołuje metodę init, zdefiniowanego na obiekcie okiennej. Ponieważ ta funkcja ma dostęp do kątowych zakresów, to gra dobrze z kątowym

To sprawia, że ​​łatwiej owinąć połączeń chmura punktów końcowych w obietnicach

Oto jak zrobić to o wiele łatwiejsze http://anandsekar.github.io/initialize-google-appengine-and-angularjs/

+0

Funkcja init zdefiniowana globalnie jest metodą init zdefiniowaną w obiekcie window. Więc nie rozumiem, dlaczego kod nie pętli. – Marc