@HostBinding
bu hatanın kafa karıştırıcı bir kaynağı olabilir.
Örneğin, bir bileşende aşağıdaki ana bilgisayar bağına sahip olduğunuzu varsayalım
// image-carousel.component.ts
@HostBinding('style.background')
style_groupBG: string;
Kolaylık olması açısından, bu özelliğin aşağıdaki input özelliği üzerinden güncellendiğini varsayalım:
@Input('carouselConfig')
public set carouselConfig(carouselConfig: string)
{
this.style_groupBG = carouselConfig.bgColor;
}
Üst bileşende, programlı olarak ngAfterViewInit
@ViewChild(ImageCarousel) carousel: ImageCarousel;
ngAfterViewInit()
{
this.carousel.carouselConfig = { bgColor: 'red' };
}
İşte olanlar:
- Ana bileşeniniz oluşturuldu
- ImageCarousel bileşeni oluşturulur ve
carousel
(ViewChild aracılığıyla)
- Biz erişemez
carousel
kadar ngAfterViewInit()
(o boş olacaktır)
- Ayarlanan yapılandırmayı atarız
style_groupBG = 'red'
- Bu
background: red
da ana ImageCarousel bileşeninde ayarlanır
- Bu bileşenin üst bileşeniniz tarafından `` sahip olduğu '', bu nedenle değişiklikleri kontrol ettiğinde bir değişiklik bulur
carousel.style.background
ve bunun bir sorun olmadığını bilecek kadar zeki değildir, bu nedenle istisnayı atar.
Bir çözüm, başka bir sarmalayıcı div içeriden ImageCarousel'i tanıtmak ve bunun üzerinde arka plan rengini ayarlamaktır, ancak daha sonra kullanmanın bazı avantajlarından yararlanamazsınız HostBinding
(örneğin, ebeveynin nesnenin tüm sınırlarını kontrol etmesine izin vermek gibi).
Ana bileşendeki daha iyi çözüm, config ayarlandıktan sonra detChanges () eklenmesidir.
ngAfterViewInit()
{
this.carousel.carouselConfig = { ... };
this.cdr.detectChanges();
}
Bu, bu şekilde ortaya çıkmış gibi görünebilir ve diğer cevaplara çok benzeyebilir, ancak ince bir fark vardır.
@HostBinding
Geliştirme sırasında daha sonraya kadar eklemediğiniz durumu düşünün . Aniden bu hatayı alıyorsunuz ve herhangi bir anlam ifade etmiyor gibi görünüyor.