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();
        },
      },
    ],
  },
];