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(() => {
// ...
});