@HostBinding peut être une source déroutante de cette erreur.
Par exemple, supposons que vous ayez la liaison hôte suivante dans un composant
// image-carousel.component.ts
@HostBinding('style.background')
style_groupBG: string;
Pour simplifier, supposons que cette propriété est mise à jour via la propriété d'entrée suivante:
@Input('carouselConfig')
public set carouselConfig(carouselConfig: string)
{
this.style_groupBG = carouselConfig.bgColor;
}
Dans le composant parent, vous le définissez par programme dans ngAfterViewInit
@ViewChild(ImageCarousel) carousel: ImageCarousel;
ngAfterViewInit()
{
this.carousel.carouselConfig = { bgColor: 'red' };
}
Voici ce qui se passe:
- Votre composant parent est créé
- Le composant ImageCarousel est créé et affecté à
carousel(via ViewChild)
- Nous ne pouvons pas accéder
carouseljusqu'à ngAfterViewInit()(ce sera nul)
- Nous attribuons la configuration, qui définit
style_groupBG = 'red'
- Ceci à son tour définit
background: redle composant ImageCarousel hôte
- Ce composant est «détenu» par votre composant parent, donc quand il vérifie les changements, il trouve un changement
carousel.style.backgroundet n'est pas assez intelligent pour savoir que ce n'est pas un problème, donc il lève l'exception.
Une solution consiste à introduire un autre diviseur de wrapper ImageCarousel et à définir la couleur d'arrière-plan, mais vous n'obtenez pas certains des avantages de l'utilisation HostBinding (comme permettre au parent de contrôler les limites complètes de l'objet).
La meilleure solution, dans le composant parent, consiste à ajouter detectChanges () après avoir défini la configuration.
ngAfterViewInit()
{
this.carousel.carouselConfig = { ... };
this.cdr.detectChanges();
}
Cela peut sembler assez évident comme ceci, et très similaire à d'autres réponses, mais il y a une différence subtile.
Considérez le cas où vous n'ajoutez @HostBindingque plus tard au cours du développement. Soudain, vous obtenez cette erreur et cela ne semble pas avoir de sens.