2013-05-14 13 views
41

Ho visto quanto segue:Quale metodo dovrei usare per avviare manualmente il mio AngularJS?

angular.bootstrap(document, ['TodoApp']); 
angular.bootstrap(angular.element("body")[0], ['TodoApp']); 

anche la documentazione AngularJS menzioni questo che io non capisco.

angular.element(document).ready(function() { 
    angular.bootstrap(document); 
    }); 

C'è qualche differenza tra questi metodi? In particolare, qual è l'ultimo metodo da parte dei documenti Angular? È meglio usare l'una rispetto all'altra?

+1

Non una risposta, ma una spiegazione: il terzo modo è solo un wrapper attorno a jQuery Lite. È un modo standard di eseguire codice quando il documento è stato completamente caricato e l'esecuzione degli script può essere avviata. Se cerchi un tutorial su jQuery, troverai qualcosa come '$ (document) .ready (function() {...})'. In Angular 'angular.element (str)' è simile a '$ (str)'. Ma tieni presente che questo utilizzerà jQuery Lite, non regolare jQuery. –

risposta

64

Sono più o meno lo stesso, con alcune differenze:


angular.bootstrap(document, ['TodoApp']); 

Ciò funzionerà se avete i vostri script caricati alla fine della pagina (anziché nell'intestazione).

Altrimenti, il DOM non verrà caricato al momento di avviare l'applicazione (non ci sarà alcun modello da compilare, le direttive non avranno alcun effetto).

Questo funziona: plnkr

Questo non: plnkr


angular.bootstrap(angular.element("body")[0], ['TodoApp']); 

Lo stesso come prima, utilizzando body come radice dell'applicazione. Utilizza un selettore che non è disponibile in jqLite, quindi è necessario avere jQuery completo jQuery incluso nell'app.

non so qual è il vantaggio di utilizzare body invece document, ma probabilmente ha qualcosa a che fare con e2e test, come spiegato in questa comment

plknr


angular.element(document).ready(function() { 
    angular.bootstrap(document); 
}); 

Questo in realtà attende il caricamento del DOM, quindi funzionerà anche se includi te r script nell'intestazione.

Questo è fondamentalmente lo stesso come jQuery di $(document).ready(, ma usando jqLite s' angular.element.


Nell'ultimo esempio, senza moduli vengono passati alla funzione di bootstrap, molto probabilmente avrete bisogno di dichiarare il vostro modulo principale, a meno che la vostra applicazione consiste solo su controller nello spazio dei nomi globale.

Quindi l'ultima opzione sarà come il seguente, al fine di essere simile agli altri due:

angular.element(document).ready(function() { 
    angular.bootstrap(document, ['TodoApp']); 
}); 

plknr

immagino che la maggior parte del tempo la scommessa più sicura sta usando questa ultima approccio.

+0

Grazie per il vostro aiuto. Un paio di domande Ho guardato i tuoi plcnrs ma ho notato che non riesco a vedere il contenuto del file script.js. Provo a fare clic su script.js ma non mi consente di fare clic su di esso. È perché li hai contrassegnati come privati? Nel mio caso non stiamo usando jQuery. Quindi quale sarebbe il metodo che suggerisci per le persone che non usano jQuery? Grazie –

+1

jQuery non è affatto necessario per angolare, a meno che non si faccia qualcosa come il secondo esempio. L'ultimo mi sembra migliore, che funziona senza jQuery. Anche l'esempio nella documen- tazione angolare segue quell'approccio di aspettare che il DOM sia pronto. – gargc

+0

Informazioni sul plnkr's ... non so cosa potrebbe essere sbagliato, sono anonimi, non vedo alcuna impostazione speciale. – gargc