2013-08-30 9 views
6

Ho letto attraverso la seguente ricetta, che mostra un modo per alimentare un frontend AngularJS con un back-end endpoint Google Cloud:Qual è la differenza tra init() e window.init()?

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

Quello che non capisco è l'appendice sulle AngularJS e Cloud endpoint inizializzazione. La sezione rilevante è il seguente:

Appendice: Suggerimenti per AngularJS + cloud Endpoints inizializzazione Tip # 1: Fare attenzione alla sequenza di inizializzazione

il guestbook app carichi tre diverse librerie JS nel seguente sequenza di :

  • AngularJS
  • L'applicazione sul guestbook
  • Google API client, WHI ch contiene gli endpoint funzionalità

Per seguire questa sequenza, l'index.html contiene i seguenti <script> tag nel tag <head> per il caricamento di ciascuna delle librerie 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> 

Una volta caricato, il terzo libreria (Google API Client) chiama la funzione di inizializzazione specificata dal parametro "onload". In questo caso , la funzione init() è prevista e invocata. Suggerimento # 2: Entra nella mondo AngularJS il più rapidamente possibile

Nella sequenza di inizializzazione, usiamo le due funzioni:

init() function 
window.init() function 

Questo init() funzione è definita in guestbook.js nel seguente modo:

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

Come si può vedere il codice sopra, la funzione appena chiamate window.init (funzione cioè init() definito nell'oggetto globale window)() funzione e non fa altro. Il window.init() è definito nel controllore AngularJS come segue:

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

In AngularJS, l'oggetto finestra globale si accede da “$ finestra” notazione che è un involucro per esso. È buona pratica in AngularJS non accedere direttamente all'oggetto finestra per migliorare la testabilità.

Il motivo per cui non si vuole eseguire l'inizializzazione nel metodo prima init() è così si può mettere il maggior numero di codice come possibile nel mondo AngularJS, come i controllori, i servizi e le direttive. Come risultato, è possibile sfruttare tutta la potenza di AngularJS e disporre di tutti gli test dell'unità, test di integrazione e così via.

Sembra che una funzione globale init() sia definita in un file javascript esterno.Questa funzione init() chiama solo window.init() (e dovrebbe essere chiamata dalla libreria client di Google dopo che è stata caricata). Ma non è window.init() nient'altro che la funzione init() definita a livello globale? Quindi non avremmo un loop qui fino a quando lo window.init() (e quindi init()) verrà ridefinito?

+1

Indossi prego contare su risorse esterne al sito Mostra il codice di cui stai parlando. Le risorse fuori sede marciscono e le persone non dovrebbero doverle visitare per aiutarti. –

risposta

0

guestbook.js definisce una funzione di inizializzazione che appare dalla descrizione come globale. Questa funzione di init è passata a google client.js. Quella funzione di init globale chiama semplicemente (un'altra) funzione globale a window.init. Il modulo angolare caricato per primo dovrebbe avere l'impostazione window.init tramite la finestra $ fornita angolare. Non c'è un ciclo, client.js chiama l'init di guestbook.js che chiama il metodo angolare $ window.init, che è lo stesso di window.init.

+0

Non ho capito bene: una funzione globalmente definita si presenta come una proprietà sull'oggetto globale, che è una finestra. Quindi, come possono esserci due diverse funzioni init e window.init? (Quindi, a mio parere, guestbook.js sovrascrive la versione definita Angular o viceversa.) – Marc

1

Questo esempio tenta di prendere l'evento init di google api e trasferirlo in ambito AngularJS.

Quando

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

viene caricato chiama la funzione init globalmente definita, che a sua volta richiama il metodo init definita sull'oggetto finestra. Poiché questa funzione ha accesso agli scopi angolari, si gioca bene con angolare

Rende più facile per avvolgere le chiamate nuvola endpoint in promesse

ecco come rendere molto più facile http://anandsekar.github.io/initialize-google-appengine-and-angularjs/

+0

La funzione init definita globalmente è il metodo init definito sull'oggetto window. Quindi non vedo perché il codice non si interrompa. – Marc