Использование inject() и модификаторов для DI в Angular
Начиная с Angular 14, появился новый способ внедрения зависимостей через функцию inject()
, которая позволяет получать сервисы без использования конструктора. Это особенно полезно в Standalone Components и ситуациях, когда хочется избавиться от лишних зависимостей в конструкторе.
Как использовать inject()
?
Вместо того чтобы объявлять зависимость в конструкторе, теперь можно получить её так:
import { inject } from '@angular/core'; import { MyService } from './my-service'; export class ExampleComponent { private myService = inject(MyService); constructor() { this.myService.log(); } }
Модификаторы для inject()
В inject()
можно передавать специальные параметры, позволяющие контролировать область видимости зависимости.
1. Эквивалент @Self()
— { self: true }
Ищет зависимость только в текущем компоненте.
const myService = inject(MyService, { self: true });
Если сервис не зарегистрирован в текущем компоненте, Angular выдаст ошибку.
2. Эквивалент @SkipSelf()
— { skipSelf: true }
Пропускает текущий уровень DI и ищет зависимость в родительском инжекторе.
const myService = inject(MyService, { skipSelf: true });
Используется, когда сервис определён только в родительском компоненте или модуле.
3. Эквивалент @Optional()
— { optional: true }
Делает зависимость необязательной — если сервис отсутствует, будет null
, а не ошибка.
const myService = inject(MyService, { optional: true });
Полезно, если сервис может отсутствовать (например, он не всегда используется в компоненте).