Bu hata, zaten yok edilmiş bir injector'dan bir servis almaya çalıştığınızda oluşur. Bu genellikle kod, bir bileşen, direktif veya modül yok edildikten sonra bağımlılıklara erişmeye çalıştığında gerçekleşir.
Yaygın senaryolar
Yok edildikten sonra geri çağırmalarda servislere erişim
Bir bileşen yok edildiğinde, injector'ı da yok edilir. Eğer bir asenkron geri çağırma daha sonra servislere erişmeye çalışırsa, bu hata oluşur:
@Component({
/*...*/
})
export class UserProfile implements OnInit {
private userClient = inject(UserClient);
ngOnInit() {
setTimeout(() => {
// HATA: Bileşen timeout tetiklenmeden önce yok edildiyse,
// injector artık kullanılabilir değildir
this.userClient.fetchData();
}, 5000);
}
}
Abonelik iptalinden sonra servislere erişim
Temizleme yanlış sırada gerçekleştiğinde observable'larla benzer sorunlar oluşur:
@Component({
/*...*/
})
export class DataView implements OnDestroy {
private dataStore = inject(DataStore);
ngOnDestroy() {
// Sorunlu: diğer temizlik işlemleri gerçekleştikten sonra
// yok etme sırasında injector'ı kullanmaya çalışma
this.dataStore.cleanup();
}
}
Hatayı ayıklama
Bu hatayı düzeltmek için:
Asenkron işlemleri kontrol edin — Geri çağırmaların, promise'lerin ve aboneliklerin bileşen yok edildiğinde iptal edildiğinden emin olun. Temizlik için
takeUntilDestroyed()veyaDestroyRefkullanın.Bağımlılıkları erken yakalayın — Geri çağırmalarda injector'a erişmek yerine servislere olan referansları sınıf alanlarında saklayın.
Yok edilmiş duruma karşı koruma sağlayın — Bileşenden daha uzun yaşayabilecek işlemler için, servislere erişmeden önce bileşenin hala etkin olup olmadığını kontrol edin.
@Component({
/*...*/
})
export class UserProfile implements OnInit {
private destroyRef = inject(DestroyRef);
private userClient = inject(UserClient);
ngOnInit() {
// Yok edildiğinde otomatik olarak iptal etmek için takeUntilDestroyed kullanın
interval(5000)
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userClient.fetchData();
});
}
}
Yığın izi, yok edilmiş injector'a nerede erişildiğini gösterir. Bileşeninden daha uzun yaşayan asenkron işlemi belirlemek için geriye doğru çalışın.