Parent appelle un @ViewChild()
L'approche de la variable locale est simple et facile.
Mais il est limité car le câblage parent-enfant doit être entièrement effectué dans le modèle parent.
Le composant parent lui-même n'a pas accès à l'enfant.
Vous ne pouvez pas utiliser la technique de variable locale si une instance de la classe de composant parent doit
lire ou écrire des valeurs de composant enfant ou doit appeler des méthodes de composant enfant.
Lorsque la classe de composant parent nécessite ce type d'accès, injectez le composant enfant dans le parent en tant que
ViewChild.
L'exemple suivant illustre cette technique avec le même exemple de compte à rebours.
Ni son apparence ni son comportement ne changeront.
L'enfant
CountdownTimerComponent est le même.
Voici le parent
CountdownViewChildParentComponent :
Il faut un peu plus de travail pour obtenir la vue enfant dans la classe de composant parent.
Tout d'abord, vous devez importer des références au décorateur
ViewChild et
AfterViewInit au crochet de cycle de vie.
Ensuite, injectez l'enfant
CountdownTimerComponent dans la propriété privée
timerComponent via la décoration
@ViewChild de la propriété.
La variable locale
#timer est partie des métadonnées du composant.
Liez plutôt les boutons aux propres méthodes
start et
stop du composant parent et présentez les secondes de graduation dans une interpolation autour de la
seconds méthode du composant parent.
Ces méthodes accèdent directement au composant de minuterie injecté.
Le crochet de cycle de vie
ngAfterViewInit() est une ride importante.
Le composant
timer n'est disponible qu'après l'affichage de la vue parent par Angular, donc, il affiche les 0 secondes initialement.
Angular appelle ensuite le point d'ancrage du cycle de vie
ngAfterViewInit auquel il est trop tard pour mettre à jour l'affichage des secondes du compte à rebours dans la vue parent.
La règle de flux de données unidirectionnelle d'Angular empêche la mise à jour de la vue parent au cours du même cycle.
L'application doit attendre un tour avant de pouvoir afficher les secondes.
Utilisez
setTimeout() pour attendre un tick, puis révisez la méthode
seconds() afin qu'elle prenne les valeurs futures du composant timer.