@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
carousel
jusqu'à ngAfterViewInit()
(ce sera nul)
- Nous attribuons la configuration, qui définit
style_groupBG = 'red'
- Ceci à son tour définit
background: red
le 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.background
et 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 @HostBinding
que plus tard au cours du développement. Soudain, vous obtenez cette erreur et cela ne semble pas avoir de sens.