angular
April 19, 2024
Токен ENVIRONMENT_INITIALIZER
Environment Injector — это обобщенная версия NgModuleRef, которая также известна как «инжектор модуля». Это один из примитивов, необходимых для поддержки API standalone - компонентов, введенного в Angular v14.
На данный момент мы можем использовать NgModule для выполнения некоторой инициализационной логики, например:
@NgModule({})
export class AppModule {
constructor(fooService: FooService) {
fooService.initalize();
}
}
@NgModule({})
export class LazyModule {
constructor(fooService: FooService) {
fooService.initalize();
}
}Подобного поведения так же можно добиться, не используя NgModule, с помощью ENVIRONMENT_INITIALIZER:
import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
bootstrapApplication(AppComponent, {
providers: [
{
provide: ENVIRONMENT_INITIALIZER,
multi: true,
useValue() {
inject(FooService).init()
}
}
]
})Код, зарегистрированный с этим токеном, будет выполнен во время инициализации приложения.
Кроме того, при переходе на лениво загруженный маршрут, маршрутизатор создает новый инжектор окружения для маршрута. Поэтому мы также можем предоставить ENVIRONMENT_INITIALIZER на ленивом маршруте, и он будет выполнен только при переходе:
export const todosRoutes: Routes = [
{
path: '',
loadComponent: () =>
import('./todos-page.component').then((m) => m.TodosPageComponent),
providers: [
{
provide: ENVIRONMENT_INITIALIZER,
multi: true,
useValue() {
inject(TodosService).init();
},
},
],
},
];