2013-08-30 6 views
6

Ich habe durch das folgende Rezept lesen, die eine Art und Weise zeigt einen AngularJS Frontend mit einem Google Cloud Endpoints Backend an der Macht:Was ist der Unterschied zwischen init() und window.init()?

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

Was ich nicht verstehe, ist der Anhang auf dem AngularJS und Cloud Endpoints Initialisierung. Der entsprechende Abschnitt ist der folgende:

Anhang: Tipps AngularJS + Cloud Endpoints Initialisierung Tipp # 1: auf der Initialisierungssequenz Vorsicht

Das Gästebuch App lädt drei verschiedene JS Bibliotheken in der folgenden Sequenz :

  • AngularJS
  • Das Gästebuch App
  • Google API-Client, whi ch enthält die Endpunkte Funktionalitäten

diese Sequenz zu folgen, die index.html enthält folgende <script> Tags im <head>-Tag für jede der JS-Bibliotheken geladen:

<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> 

Einmal geladen, die dritte Bibliothek (Google API Client) ruft die Initialisierungsfunktion auf, die durch den Parameter 'onload' angegeben wird. In diesem Fall wird die Funktion init() erwartet und aufgerufen. Tipp # 2: Geben Sie in die AngularJS Welt so schnell wie möglich

In der Initialisierungssequenz, verwenden wir die zwei Funktionen:

init() function 
window.init() function 

Diese Funktion init() in guestbook.js im folgenden definiert ist, übrigens:

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

Wie Sie den Code oben sehen können, ist die Funktion window.init nur() aufruft Funktion (dh init() Funktion im globalen Fensterobjekt definiert) und tut nichts anderes. Die window.init() ist in den AngularJS Controller wie folgt definiert:

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

In AngularJS, das globalen Fensterobjekt von „$ window“ notation zugegriffen wird, die ein Wrapper für sie ist. Es ist eine bewährte Methode in AngularJS , nicht direkt auf das Fensterobjekt zuzugreifen, um die Testbarkeit zu verbessern.

Der Grund, warum Sie nicht die Initialisierung im erste Methode init() ausführen wollen, ist so können Sie so viel Code wie möglich in der AngularJS Welt, wie Steuerungen, Dienstleistungen und Richtlinien setzen. Als Ergebnis können Sie die volle Leistung von AngularJS nutzen und haben alle Ihre Komponententests, Integrationstests und so weiter.

Es scheint, dass eine globale Funktion init() in einer externen Javascript-Datei definiert wird.Diese init() Funktion ruft nur window.init() (und soll von der Google-Client-Bibliothek aufgerufen werden, nachdem es geladen wurde). Aber ist window.init() nichts als die global definierte init() Funktion? Würden wir hier nicht eine Schleife bekommen, bis window.init() (und damit init()) neu definiert wird?

+1

Bitte machen don Verlassen Sie sich nicht auf externe Ressourcen. Zeigen Sie den Code, von dem Sie sprechen. Off-Site-Ressourcen verrotten, und die Leute sollten sie nicht besuchen müssen, um Ihnen zu helfen. –

Antwort

0

guestbook.js definiert eine init-Funktion, die aus Ihrer Beschreibung als global erscheint. Diese Init-Funktion wird an den Google-Client client.js übergeben. Diese globale Init-Funktion ruft nur eine (andere) globale Funktion bei window.init auf. Das zuerst geladene Winkelmodul sollte window.init über das winkelmäßig vorgesehene $ -Fenster eingerichtet haben. Es gibt keine Schleife, client.js ruft die init von guestbook.js auf, die die angulare Methode $ window.init aufruft, die mit window.init identisch ist.

+0

Ich verstehe nicht ganz: Eine global definierte Funktion zeigt sich als eine Eigenschaft auf dem globalen Objekt, das heißt Fenster. Wie kann es also zwei verschiedene Funktionen init und window.init geben? (So ​​mit meinem Verständnis, entweder guestbook.js überschreibt die Angular-definierte Version oder umgekehrt.) – Marc

1

In diesem Beispiel wird versucht, das Google API-Init-Ereignis zu übernehmen und in den AngularJS-Bereich zu übertragen.

Wenn

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

geladen wird, ruft es die Funktion init global definiert, was wiederum die Init-Methode ruft das Fensterobjekt definiert. Da diese Funktion Zugriff auf die Winkel Bereiche hat, es spielt gut mit Winkel

Es macht es einfacher, in Versprechen Cloud Endpunkt Anrufe wickeln

Hier ist, wie es viel einfacher http://anandsekar.github.io/initialize-google-appengine-and-angularjs/

+0

Die global definierte init-Funktion ist die init-Methode auf dem Fenster-Objekt definiert. Ich sehe also nicht, warum der Code keine Schleife machen würde. – Marc

Verwandte Themen