@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를 통해)에 지정됩니다.
- 우리는
carousel
때까지 액세스 할 수 없습니다 ngAfterViewInit()
(널이 될 것입니다)
- 우리는 구성을 할당합니다.
style_groupBG = 'red'
- 차례로
background: red
호스트 ImageCarousel 구성 요소에 설정 됩니다.
- 이 구성 요소는 부모 구성 요소가 '소유'하므로 변경 사항을 확인할 때 변경 사항을 발견하고
carousel.style.background
이것이 문제가 아님을 알기에는 영리하지 않으므로 예외가 발생합니다.
한 가지 해결책은 ImageCarousel에 다른 래퍼 div를 도입하고 그에 배경색을 설정하는 것입니다. 그러나 HostBinding
부모가 객체의 전체 경계를 제어하도록 허용하는 등 의 이점을 얻을 수는 없습니다 .
상위 구성 요소에서 더 나은 솔루션은 구성을 설정 한 후 detectChanges ()를 추가하는 것입니다.
ngAfterViewInit()
{
this.carousel.carouselConfig = { ... };
this.cdr.detectChanges();
}
이것은 이와 같이 명백하게 보일 수 있으며 다른 답변과 매우 유사하지만 미묘한 차이가 있습니다.
@HostBinding
나중에 개발 중에 추가하지 않는 경우를 고려하십시오 . 갑자기이 오류가 발생하고 의미가없는 것 같습니다.