2017-03-23 6 views
2

Wie kann ich ngOnChanges erst auslösen, nachdem alle Eingabewerte in ngOnInit gesetzt wurden? Mein Code ->Wie kann ich ngOnChanges nur auslösen, nachdem alle Eingabewerte in ngOnInit gesetzt wurden

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

ich gewohnt das Array ich in ngonit in ngonchanges initialisiert, weil ngonchanges vor ngonit genannt wird, wie kann ich überprüfen, ob alle vor der Prüfung ngonchanges initialisiert werden?

+0

Dies ist normales Verhalten. Sehen Sie sich die [Lifecycle-Hooks] (https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html) in Angular 2 an. Statt 'ngOnChange' können Sie' ngAfterViewInit() 'zum Beispiel versuchen (Antwort nach Angular initialisiert die Ansichten und untergeordneten Ansichten der Komponente) – mickdev

+1

Ja, das weiß ich. Gibt es eine Möglichkeit, die Änderung meiner Eingaben zu hören, nachdem ngoninit ausgeführt wurde? – RemyaJ

+0

Gleich nach dem 'ngOnInit()' wird 'ngDoCheck()' ausgeführt (wird aber mehrfach ausgeführt). Wenn Sie reaktive Formulare verwenden, können Sie ngOnChange beibehalten und prüfen, ob die Formularfelder gesetzt sind ('if (this.form.get ('yourField'). Value) ...'). Etwas Ähnliches wie das, was Sie jetzt haben. – mickdev

Antwort

0

Eine Methode, die ich gefunden habe, die funktioniert, basiert auf der Tatsache, dass die Eingabewerte alle eine vorherige Werteigenschaft haben. Wenn die Eingabe zuvor nicht festgelegt wurde, lautet dieser Wert CD_INIT_VALUE (als Zeichenfolge). Sie können also eine Bedingung festlegen, dass Ihr Codeblock in ngOnChanges nur ausgeführt werden soll, wenn der vorherige Wert nicht CD_INIT_VALUE ist. Hier ist ein Beispiel für den Fall, dass Sie alle Eingabewerte sind testen:

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 
    }  
} 

Es gibt wahrscheinlich elegantere Lösungen, aber ich gefunden habe, das funktioniert. Dies ist wahrscheinlich zu spät, um Ihnen zu helfen, aber kann anderen helfen, als wenn ich das googled, fand ich diese Frage. Die Lösung war etwas, was ich beim Debugging herausgefunden habe.

Verwandte Themen