APP_INITIALIZER to wbudowany w Angulara InjectionToken.
Pod InjectionToken można zarejestrować wartość, funkcję albo serwis. Token ten można wstrzyknąć do komponentu lub serwisu.
Przykład zdefiniowania MY_TOKEN:
Natomiast, dzięki tokenowi APP_INITIALIZER, możliwe jest wykonanie funkcji, lub zestawu funkcji, które zostaną wykonane przed uruchomieniem aplikacji (bootstraping).
Przykład
Prosty przykład wywołania dwóch funkcji przed startem aplikacji:
exportfunctionappInit1(){return()=>console.log('Hello from appInit1!');}exportfunctionappInit2(){return()=>console.log('Hello from appInit2!');}
Parametr multi pozwala na rejestrację dwóch lub więcej funkcji pod APP_INITIALIZER:
W konsoli przeglądarki pojawią się poniższe komunikaty:
Hello from appInit1!
Hello from appInit2!
Przykład z Promise
Do APP_INITIALIZER można także przekazać funkcję, która zwróci Promise! Angular poczeka, aż wszystkie zwrócone Promise’y zostaną rozwiązane (resolved).
exportfunctionappInit(){return()=>newPromise((resolve,reject)=>{setTimeout(()=>{console.log('Hello from appInit');resolve();},2000);})}@NgModule({// (...)providers:[{provide:APP_INITIALIZER,useFactory:appInit,multi:true}],// (...)})exportclassAppModule{}
W rezultacie, po 2 sekundach od wywołania funkcji appInit, w konsoli zostanie wyświetlona wiadomość: Hello from appInit.
Zaawansowany przykład
Do funkcji uruchamianej przed bootstrapem aplikacji możliwe jest wstrzyknięcie serwisu.
W poniższym przykładzie aplikacja frontendowa ściąga konfigurację wymaganą do poprawnego działania.
Na backendzie wystawiony jest plik conf.json, serwowany przez http-server.
Interface Configuration jest modelem danych z pliku conf.json, zawiera tylko pole name.
Serwis AppInitService wywołuje żądanie typu GET na /api/conf.json.
Powyższy kod wyświetli w konsoli konfigurację z pliku conf.json.
{name: "Test App name"}
Implementacja w Angularze
Przyjrzyjmy się teraz, w jaki sposób APP_INITIALIZER został zaimplementowany w samym Angularze.
W pliku application_init.ts znajduje się definicja InjectionToken.
W punkcie (1) w serwisie ApplicationInitStatus wywołana jest funkcja runInitializers. Po zakończeniu ApplicationInitStatus, Angular przeprowadza bootstrap komponentu.