Внести вклад
Энциклопедия ошибок

Injector уже уничтожен

Эта ошибка возникает, когда вы пытаетесь получить сервис из injector, который уже уничтожен. Обычно это происходит, когда код пытается получить доступ к зависимостям после уничтожения компонента, директивы или модуля.

Типичные сценарии

Доступ к сервисам в callbacks после уничтожения

Когда компонент уничтожается, уничтожается и его injector. Если асинхронный callback позже пытается получить доступ к сервисам, возникает эта ошибка:

@Component(/* ... */)
export class UserProfile implements OnInit {
  private userClient = inject(UserClient);

  ngOnInit() {
    setTimeout(() => {
      // ERROR: If component was destroyed before timeout fires,
      // the injector is no longer available
      this.userClient.fetchData();
    }, 5000);
  }
}

Доступ к сервисам после отписки

Похожие проблемы возникают с observables, если очистка выполняется в неправильном порядке:

@Component(/* ... */)
export class DataView implements OnDestroy {
  private dataStore = inject(DataStore);

  ngOnDestroy() {
    // Problematic: attempting to use the injector during destruction
    // after other cleanup may have occurred
    this.dataStore.cleanup();
  }
}

Отладка ошибки

Чтобы исправить эту ошибку:

  1. Проверьте асинхронные операции — убедитесь, что callbacks, promises и подписки отменяются при уничтожении компонента. Используйте takeUntilDestroyed() или DestroyRef для очистки.

  2. Захватывайте зависимости заранее — храните ссылки на сервисы в полях класса, а не обращайтесь к injector в callbacks.

  3. Защищайтесь от уничтоженного состояния — для операций, которые могут пережить компонент, проверяйте, активен ли компонент, перед доступом к сервисам.

@Component(/* ... */)
export class UserProfile implements OnInit {
  private destroyRef = inject(DestroyRef);
  private userClient = inject(UserClient);

  ngOnInit() {
    // Use takeUntilDestroyed to automatically cancel when destroyed
    interval(5000)
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe(() => {
        this.userClient.fetchData();
      });
  }
}

Stack trace указывает, где был доступ к уничтоженному injector. Идите назад, чтобы определить асинхронную операцию, пережившую свой компонент.