# AngularJS - app init
# Bootstrap d'une app web
Le browser lève l'event DOMContentLoaded durant ce step. Le moment exact est aléatoire, il n'attend pas le chargement des ressources liées à la page (css et images), le html et les js associés sont chargés cependant, on passe direct au point 3, le point 2 se joue en parallèle.
Le browser lève l'event load en fin de step. Toutes les dépendances (de la page d'index) ont été téléchargées (non bloquant pour le démarrage angular).
Démarrage Angular
la méthode
angularInit(element, bootstrap)
est exécutée. Elle cherche la directiveng-app
et son paramètre (le module racine de l'application).la méthode
bootstrap(element, bootstrap)
est exécutée. Elle détermine si le bootstrap de l'app doit se faire maintenant ou si il est délayé. Si il n'est pas délayé elle crée l'injecteur viacreateInjector(modulesToLoad, strictDi)
création de l'injecteur via
createInjector(modulesToLoad, strictDi)
Tous les modules angular et leurs sous modules (modules optionnels comme ngLocale) sont chargés. Un cache des composants est créé (les services sont des singletons, s'ils ne sont pas instanciés ils le sont et sont ajoutés au cache, à chaque nouvel appel le cache est vérifié et si angular trouve quelque chose il sert l'élément présent dans le cache et ne fait pas de nouvelle instanciation). Viennent ensuite toutes les dépendances déclarées sur le module principal. Durant cette phase tout l'arbre des dépendance est parsé. Une liste desconfig()
à exécuter est constituée ainsi qu'une liste derun()
Lesconfig()
de tous les modules sont ensuite exécutés dans l'ordre inverse de l'arbre. Seuls les services de typeprovider
etconstant
peuvent être injectés. puisrun()
de tous les modules dans le même ordre que pourconfig()
Lesprovider
sont interdits à ce stade (pas de config deprovider
au runtime.L'injecteur a été créé. Tous les modules ont joué leur
config()
puis leurrun()
en terminant par celui du module principal de l'app. L'injecteur crée le$rootScope
puis compile l'app sur la base deng-app
qui sert de racine. Si une directiveng-controller
est rencontrée, l'injecteur est appelé pour instancier le controller associé.La webapp est rendue, elle attend une interaction de l'utilisateur.
# Exemple ordre d'exécution des modules au bootstrap
Ex, on a la hiérarchie suivante :
app
app.moduleA
app.moduleA.subModuleA1
app.moduleB
2
3
4
l'ordre d'exécution sera :
app.moduleB
app.moduleA.subModuleA1
app.moduleA
app
2
3
4
ou
app.moduleA.subModuleA1
app.moduleA
app.moduleB
app
2
3
4
mais jamais
app.moduleA
app.moduleA.subModuleA1
app.moduleB
app
2
3
4
# Documentation à check
- ng dev guide - module
- ng dev guide - bootstrap
- ng dev guide - dependency injection
- angular.module
- angular.injector
- ngApp
- ngView
- $injector
- $provide
- $location
# knowing when the a view has finished loading
not possible because of MVVM pattern
# others topics
- Misko Hevery comment on an angular GitHub issue
- is there a post render callback for angular directive
- how to invoke a function in an angular directive after the child nodes have been processed
- What is meant by Bootstrapping in angular JS?
- sending event when angular finished loading
- les fondations de AngularJS