Bu hata, Angular bağımlılık enjeksiyonu sırasında bir sınıf için bir bağımlılığı çözemediğinde oluşur. Bu en çok constructor enjeksiyonu kullanan sınıfları etkiler; burada Angular parametre türlerini belirlemek için TypeScript metadata'sına dayanır.
En yaygın nedenler şunlardır:
- Bir servis sınıfında
@Service()veya@Injectabledekoratörü eksik - Bir
InjectionTokeniçin uygun sağlayıcı tanımı yok - Bir constructor parametresi çözümlenemiyor
NOTE: inject() fonksiyonu açık bir token alır, bu nedenle "çözümlenemeyen parametre" senaryosu doğrudan ona uygulanmaz. Ancak enjekte edilen sınıfın kendisinde @Service() eksikse ve kendi constructor bağımlılıkları varsa, hata yine de oluşabilir.
Yaygın senaryolar
Eksik @Service() dekoratörü
Bir sınıfın constructor bağımlılıkları olduğu halde @Service() dekoratörü olmadığında, Angular parametrelerini çözümleyemez:
Missing @Service() decorator
export class UserClient {
constructor(private http: HttpClient) {} // Angular bunu çözümleyemez
}
Bunu düzeltmek için @Service() dekoratörünü ekleyin:
@Service()
export class UserClient {
constructor(private http: HttpClient) {}
}
Çözümlenemeyen constructor parametreleri
Bu hata ayrıca Angular bir constructor parametresinin türünü belirleyemediğinde de ortaya çıkar:
@Service()
export class DataStore {
// Angular bir sağlayıcı olmadan 'config'i çözümleyemez
constructor(private config: AppConfig) {}
}
Tüm constructor parametrelerinin ya yapılandırılmış sağlayıcılarının olduğundan ya da isteğe bağlı bağımlılıklar için @Optional() kullandığından emin olun.
Hatayı ayıklama
Hata mesajı hangi token'ın çözümlenemediğine dair ayrıntılar içerir:
Can't resolve all parameters for X: (?, ?, ?)—?işaretleri çözümlenemeyen parametreleri gösterir. Sınıfın@Serviceveya@Injectable()dekoratörüne sahip olduğunu ve tüm bağımlılıkların sağlayıcılarının bulunduğunu kontrol edin.Token X is missing a ɵprov definition— BirInjectionTokensağlayıcı yapılandırılmadan kullanılmış. Token'ı{provide: TOKEN, useValue: ...}kullanarak bir değerle kaydedin veya token tanımına varsayılan bir factory ekleyin.
Hatanın yığın izinden geriye doğru çalışarak sorunlu enjeksiyonun nerede gerçekleştiğini belirleyin, ardından şunları doğrulayın:
- Sınıfın
@Serviceveya@Injectable()dekoratörüne sahip olduğunu - Tüm constructor parametrelerinin kayıtlı sağlayıcılarının bulunduğunu
- Herhangi bir
InjectionToken'ın yapılandırılmış bir sağlayıcıya veya varsayılan değere sahip olduğunu