@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()
(它将为null)
- 我们分配配置,
style_groupBG = 'red'
- 依次设置
background: red
宿主ImageCarousel组件
- 该组件由您的父组件“拥有”,因此在检查更改时会发现更改,
carousel.style.background
并且不够聪明,无法知道这不是问题,因此会引发异常。
一种解决方案是引入另一个wrapper div内部ImageCarousel并在其上设置背景色,但是这样您将无法获得使用的某些好处HostBinding
(例如,允许父级控制对象的整个边界)。
在父组件中,更好的解决方案是在设置配置后添加detectChanges()。
ngAfterViewInit()
{
this.carousel.carouselConfig = { ... };
this.cdr.detectChanges();
}
这样看起来可能很明显,并且与其他答案非常相似,但是存在细微差别。
考虑这种情况,@HostBinding
直到开发后期才添加。突然您收到此错误,并且似乎没有任何意义。