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.