L'OP semble penser qu'il ne répond pas à ses besoins, ou n'est pas élégant, mais il semble que Vale de Steve réponse est l'approche la plus logique ici.
Dans mon cas, j'avais besoin d'attendre 2 enfant composants pour initialiser, qui contrôlent les panneaux gauche et droit de mon application. J'ai deux enfants composants de déclarer leur initialisation d'un service partagé:
constructor(
public _navigate: RouteNavigationService // service shared between all child components and parent
){}
ngOnInit() {
this._navigate.setChildInit(this.panel);
}
De services partagés (RouteNavigationService):
private _leftChildInit = new Subject();
private _rightChildInit = new Subject();
leftChildInit$ = this._leftChildInit.asObservable();
rightChildInit$ = this._rightChildInit.asObservable();
setChildInit(panel){
switch(panel){
case 'leftPanel':
console.log('left panel initialized!');
this._leftChildInit.next(true);
break;
case 'rightPanel':
console.log('right panel initialized!');
this._rightChildInit.next(true);
break;
}
}
Ensuite dans mon composant parent-je utiliser le zip de la méthode de combiner plusieurs Observables ensemble (Vous pouvez ajouter d'autres composants enfants ici) et attendre pour eux tout à la fin:
childInitSub: Subscription;
constructor(
public _navigate: RouteNavigationService
) {
this.childInitSub = Observable.zip( // WAIT FOR BOTH LEFT & RIGHT PANELS' ngOnInit() TO FIRE
this._navigate.leftChildInit$,
this._navigate.rightChildInit$).subscribe(data =>
// Both child components have initialized... let's go!
);
}
Les OP membres dans un commentaire
"Je n'aime pas cela, car à chaque fois que j'ajoute un nouveau composant, j'ai besoin de
attendre pour une période supplémentaire de onInit de l'événement et ont pour la mettre en œuvre"
Mais, en réalité, tout ce que vous avez à faire est de faire un autre Subject
à votre service pour le nouveau composant enfant ngOnInit, et d'ajouter une ligne supplémentaire dans le composant parent zip méthode.
Notez que l'on a accepté de répondre ici, en utilisant ngAfterViewInit() n'est pas tout à fait la même chose que ci-dessus. Dans mon cas, à l'aide de ngAfterViewInit()
a été la production d'un ExpressionChangedAfterItHasBeenCheckederror qui est au-delà de la portée de cette question, mais sert à démontrer que cette approche n'est pas en train de faire la même chose.
En revanche, la méthode ci-dessus est tout à fait littéralement déclenchée uniquement comme un résultat direct de tous vos composants enfants' ngOnInit()
événements ayant déclenché.