J'essaie d'initialiser le plugin dans l'élément parent via le service, puis utilisez l'objet du plug-in dans les composants enfants. Mais j'ai un problème que l'objet Plugin retourne non défini dans les composants de l'enfant. Je crois que si j'initialise le plugin dans le constructeur (), je pouvais alors y accéder des composants de l'enfant, mais je ne sais pas comment faire cela.
Composant parent P>
export class AccordionComponent implements OnInit { constructor(private tooltip: TooltipService) { } ngOnInit(): void { console.log(this.tooltip.plugin.class); } }
3 Réponses :
In TooltipService code, your initPlugin function accepting a string parameter. public initPlugin(elementId: string): void { this.plugin = new pluginName(elementId); } But in Parent Component, you are calling initPlugin function without any arguments. this.tooltip.initPlugin(); so that's why it return undefined.
Désolé, j'ai oublié de l'ajouter, mais cela revient de toute façon non définie.
Vous devez utiliser RXJS pour cela car vous avez des problèmes de chronométrage où vous y accédez dans l'enfant avant qu'il soit défini par le parent, RxJS résoudra cela une fois pour toutes ...
private sub: Subscription; ngOnInit(): void { // subscribe to observable to receive values, store subscription ref this.sub = this.tooltip.plugin$.susbcribe(plugin => console.log(plugin.class)); } ngOnDestroy() { this.sub.unsubscribe(); // always unsubscribe }
Merci, j'avais eu une idée d'utiliser des rxjs aussi, mais y a-t-il une option pour réussir ElementID au constructeur de services () afin que je puisse initialiser plugin là-bas.
Je ne vois pas pourquoi cela changerait quoi que ce soit ... Vous avez toujours cette option ... vous vous rendez comme des jetons d'injecteur maintenant, ce qui est un sujet tout à fait différent et une question entièrement différente.
On dirait que vos composants sont initialisés dans le mauvais ordre. P>
Oninit est initialisé avant aprèsViewInit. Essayez de le changer;) p>