angular
April 19
Токен 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(); }, }, ], }, ];