Hata Ansiklopedisi

inject() bir enjeksiyon bağlamından çağrılmalıdır

Bu hatayı, inject fonksiyonunu izin verilen enjeksiyon bağlamı dışında kullanmaya çalıştığınızda görürsünüz. Enjeksiyon bağlamı, sınıf oluşturma ve başlatma sırasında kullanılabilir. Ayrıca runInInjectionContext ile kullanılan fonksiyonlar için de kullanılabilir.

Pratikte inject() çağrılarına bir constructor'da, bir constructor parametresinde ve bir alan başlatıcısında izin verilir:

@Service()
export class Car {
  radio: Radio | undefined;

  // OK: alan başlatıcı
  spareTyre = inject(Tyre);

  constructor() {
    // OK: constructor gövdesi
    this.radio = inject(Radio);
  }
}

inject fonksiyonunu bir sağlayıcının factory'sinden çağırmak da geçerlidir:

providers: [
  {
    provide: Car,
    useFactory: () => {
      // OK: bir sınıf factory'si
      const engine = inject(Engine);
      return new Car(engine);
    },
  },
];

Sınıf oluşturma veya runInInjectionContext dışındaki inject fonksiyonu çağrıları hataya neden olacaktır. Özellikle, bir sınıf örneği oluşturulduktan sonra metotlarda (yaşam döngüsü kancaları dahil) inject() çağrılarına izin verilmez:

@Component({ ... })
export class Car {
  ngOnInit() {
    // HATA: çok geç, bileşen örneği zaten oluşturulmuş
    const engine = inject(Engine);
    engine.start();
  }
}

Hatayı ayıklama

Hatanın yığın izinden geriye doğru çalışarak izin verilmeyen inject() çağrısının bulunduğu yeri belirleyin.

Hatayı düzeltmek için inject çağrısını izin verilen bir yere (genellikle bir sınıf constructor'ına veya bir alan başlatıcısına) taşıyın.

NOT: Bir test bağlamında çalıştırıyorsanız, TestBed.runInInjectionContext fonksiyonu inject() çağrısının başarılı olmasını sağlayacaktır.

TestBed.runInInjectionContext(() => {
  // ...
});