2016-02-18 43 views
9

Come posso ascoltare le modifiche su ngModel? Il problema: è che se io collego (cambia) o (clic) evento all'elemento, nella funzione data quando accedo al modello, non è ancora cambiato. Se aggiungo setTimeout di 500 ms di quanto possa fare il modello modificato. Qualche idea su come posso ottenere il vero oggetto cambiato senza setTimeout che è molto brutto? codice nel HTML:Angular 2 ascolta il cambio di modello

<input type="checkbox" (click)="autoJoinToggle()" [(ngModel)]='active.bookmark.autoJoin'> Autojoin 

codice nel componente:

console.log(this.active.bookmark.autoJoin) // returns the current value (before the change) 
setTimeout(() => {console.log(this.active.bookmark.autoJoin);}, 500); //returns the value after the change 

non posso farlo con controllo angolare perché ho bisogno del modello associato, l'oggetto "attivo" non esiste in primo luogo e se voglio aggiornare il valore del controllo dopo aver definito "attivo", devo ascoltare le modifiche sull'oggetto "attivo" (che cambia gli straordinari). Lo stesso problema è con la variabile locale e @ViewChild -> Devo ancora sapere quando cambi "attivi" così aggiorno anche la variabile locale.

Ecco una gif così: enter image description here

risposta

7
(ngModelChange)="doSomething($event)" 

o

autoJoinToggle(cb){ this.active.bookmark.autoJoin = cb; //do something.. } 

<input #cb type="checkbox" (click)="autoJoinToggle(cb.checked)" 
    [(ngModel)]='active.bookmark.autoJoin'> 

Credo che il comportamento si spiega è un bug e anche se una richiesta di pull già previsto, ma non ha aggiunto https://github.com/angular/angular/issues/6311.

+1

Questa soluzione con la variabile locale + ngModel funziona ma nella funzione doSomething imposto esplicitamente 'this.active.autoJoin = cb.checked' che suppongo sia ok per la soluzione temporanea fino a quando il problema non viene risolto –

+0

È possibile aggiungere ' autoJoinToggle (cb) { this.active.bookmark.autoJoin = cb; // fai qualcosa .. } quindi sarà la soluzione completa per qualcun altro da vedere –