Question
Quelle est la façon la plus élégante d'obtenir @ViewChild
après l'affichage de l'élément correspondant dans le modèle ?
Voici un exemple. Voir aussi Plunker disponible.
Composant.template.html :
<div id="layout" *ngIf="display">
<div #contentPlaceholder></div>
</div>
Component.component.ts :
export class AppComponent {
display = false;
@ViewChild('contentPlaceholder', { read: ViewContainerRef }) viewContainerRef;
show() {
this.display = true;
console.log(this.viewContainerRef); // undefined
setTimeout(() => {
console.log(this.viewContainerRef); // OK
}, 1);
}
}
J'ai un composant dont le contenu est masqué par défaut. Lorsque quelqu'un appelle show()
il devient visible. Cependant, avant que la détection de changement d'Angular 2 ne soit terminée, je ne peux pas faire référence à viewContainerRef
. J'ai l'habitude de regrouper toutes les actions requises dans setTimeout(()=>{},1)
comme indiqué ci-dessus. Existe-t-il une méthode plus correcte ?
Je sais qu'il existe une option avec ngAfterViewChecked
mais cela entraîne trop d'appels inutiles.
6 votes
Avez-vous essayé d'utiliser l'attribut [hidden] au lieu de *ngIf ? Cela a fonctionné pour moi dans une situation similaire.