2017-03-23 1 views
2

Comment déclencher ngOnChanges uniquement après avoir défini toutes les valeurs d'entrée dans ngOnInit. Mon code ->Comment déclencher ngOnChanges uniquement après avoir défini toutes les valeurs d'entrée dans ngOnInit

`ngOnInit() { 
this.multiSelectorData.forEach(item=>{ 
      this.allItems.push(item.data); 
     }); 
} 
ngOnChanges(changes: SimpleChanges) { 
     if(changes['dataReady'] && changes['dataReady'].currentValue) { 
    console.log(this.allItems); 
}` 

Je reçois wont le tableau I dans initialisés ngonit en ngonchanges parce ngonchanges est appelé avant ngonit, comment puis-je vérifier si tous sont initialisés avant de vérifier ngonchanges?

+0

Ceci est un comportement normal. Jetez un coup d'œil à [Lifecycle Hooks] (https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html) dans les documents Angular 2. Au lieu de 'ngOnChange', vous pouvez essayer' ngAfterViewInit() 'par exemple (Répondre après que Angular initialise les vues et les vues enfants du composant) – mickdev

+1

Oui, je le sais. Est-il possible d'écouter le changement de mes entrées après l'exécution de ngoninit? – RemyaJ

+0

Juste après 'ngOnInit()', 'ngDoCheck()' est exécuté (mais il sera exécuté plusieurs fois). Si vous utilisez des formulaires réactifs, vous pouvez conserver ngOnChange et vérifier si les champs de formulaire sont définis ('if (this.form.get ('yourField'). Value) ...'). Quelque chose de similaire à ce que vous avez maintenant. – mickdev

Répondre

0

Une méthode que j'ai trouvée qui fonctionne est basée sur le fait que les valeurs d'entrée ont toutes une propriété de valeur précédente. Si l'entrée n'a pas été précédemment définie, cette valeur sera CD_INIT_VALUE (sous la forme d'une chaîne). Vous pouvez donc faire en sorte que votre bloc de code au ngOnChanges ne fonctionne que si la valeur précédente n'est pas CD_INIT_VALUE. Voici un exemple pour votre cas où vous testez toutes les valeurs d'entrée:

ngOnChanges(changes: SimpleChanges) { 
    let initialized: boolean = true; 
    for (let prop in changes) { 
    if (changes[prop].previousValue.toString() === 'CD_INIT_VALUE') { 
     initialized = false; 
     //we can break here since if any item is not initialized 
     //we will say the inputs are NOT initialized 
     break; 
    } 
    } 

    if (initialized) { 
    //code you want to execute 
    }  
} 

Il y a probablement des solutions plus élégantes, mais j'ai trouvé cela fonctionne. Il est probablement trop tard pour vous aider mais peut aider les autres car quand j'ai googlé ceci j'ai trouvé cette question. La solution a été quelque chose que j'ai compris à partir du débogage.