2016-02-18 10 views
9

Jak mogę nasłuchiwać zmian na ngModel? Problem polega na tym, że jeśli połączyłem (zmieniłem) lub (kliknęło) zdarzenie z elementem, w danej funkcji, gdy uzyskuję dostęp do modelu, jego wciąż nie zmieniono. Jeśli dodam setTimeout 500ms niż mogę zmienić model. Każdy pomysł, w jaki sposób można uzyskać prawdziwy zmieniony obiekt bez setTimeout, który jest bardzo zły sposób? kod w html:Angular 2 nasłuchuj na zmianie modelu

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

kod w komponencie:

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 

Nie mogę tego zrobić z Kątowymi Kontroli bo muszę model binded i „aktywnego” obiekt nie istnieje w pierwszej kolejności , i jeśli chcę zaktualizować wartość kontrolki po zdefiniowaniu "aktywnego", muszę słuchać zmian na "aktywnym" obiekcie (który zmienia nadgodziny). Ten sam problem dotyczy zmiennej lokalnej i @ViewChild -> Nadal muszę wiedzieć, kiedy "aktywny" się zmienia, więc aktualizuję również zmienną lokalną.

Oto gif także: enter image description here

Odpowiedz

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

lub

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

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

myślę zachowanie można wyjaśnić to bug choć i wyciągnąć wniosek już zapewnione, ale nie dodał https://github.com/angular/angular/issues/6311.

+1

Rozwiązanie to z konieczności lokalną zmienną + ngModel działa, ale w funkcji doSomething jawnie ustawić 'this.active.autoJoin = cb.checked' co chyba jest w porządku za rozwiązanie tymczasowe, aż problem zostanie ustalony –

+0

można dodać ' autoJoinToggle (cb) { this.active.bookmark.autoJoin = cb; // Zrób coś .. } ' } To będzie kompletne rozwiązanie dla kogoś innego –