@HostBinding
このエラーは、混乱を招く可能性があります。
たとえば、コンポーネントに次のホストバインディングがあるとします。
// image-carousel.component.ts
@HostBinding('style.background')
style_groupBG: string;
簡単にするために、このプロパティが次の入力プロパティを介して更新されるとしましょう:
@Input('carouselConfig')
public set carouselConfig(carouselConfig: string)
{
this.style_groupBG = carouselConfig.bgColor;
}
親コンポーネントでは、プログラムで設定しています ngAfterViewInit
@ViewChild(ImageCarousel) carousel: ImageCarousel;
ngAfterViewInit()
{
this.carousel.carouselConfig = { bgColor: 'red' };
}
ここで何が起こるかです:
- 親コンポーネントが作成されます
- ImageCarouselコンポーネントが作成され、
carousel
(ViewChildを介して)に割り当てられます
- (nullになります)
carousel
までアクセスできませんngAfterViewInit()
- 設定を割り当てる、設定します
style_groupBG = 'red'
- これ
background: red
により、ホストのImageCarouselコンポーネントが設定されます。
- このコンポーネントは親コンポーネントによって「所有」されているため、変更をチェックすると、変更が検出され
carousel.style.background
、問題ではないことを認識するのに十分ではないため、例外がスローされます。
1つの解決策は、ImageCarouselに別のラッパーdivインサイダーを導入し、その上に背景色を設定することですが、使用するといくつかの利点が得られません HostBinding
(親がオブジェクトの完全な境界を制御できるようにするなど)。
親コンポーネントでのより良い解決策は、設定を設定した後にdetectChanges()を追加することです。
ngAfterViewInit()
{
this.carousel.carouselConfig = { ... };
this.cdr.detectChanges();
}
これは、このように設定された非常に明白なように見え、他の回答と非常に似ていますが、微妙な違いがあります。
@HostBinding
開発中の後半まで追加しない場合を検討してください。突然あなたはこのエラーを受け取り、それは意味をなさないようです。