Saya mencoba untuk mendeteksi perubahan pada ngModel
dalam <select>
tag. Di Angular 1.x, kita mungkin menyelesaikan ini dengan $watch
on ngModel
, atau dengan menggunakan ngChange
, tapi saya belum memahami cara mendeteksi perubahan ngModel
di Angular 2.
Contoh Lengkap : http://plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info
import {Component, View, Input, } from 'angular2/core';
import {FORM_DIRECTIVES} from 'angular2/common';
@Component({
selector: 'my-dropdown'
})
@View({
directives: [FORM_DIRECTIVES],
template: `
<select [ngModel]="selection" (ngModelChange)="onChange($event, selection)" >
<option *ngFor="#option of options">{{option}}</option>
</select>
{{selection}}
`
})
export class MyDropdown {
@Input() options;
selection = 'Dog';
ngOnInit() {
console.log('These were the options passed in: ' + this.options);
}
onChange(event) {
if (this.selection === event) return;
this.selection = event;
console.log(this.selection);
}
}
Seperti yang bisa kita lihat, jika kita memilih nilai yang berbeda dari tarik-turun, ngModel
perubahan kita , dan ekspresi yang diinterpolasi dalam tampilan mencerminkan hal ini.
Bagaimana cara mendapatkan pemberitahuan tentang perubahan ini di kelas / pengontrol saya?
javascript
angular
lux
sumber
sumber
Jawaban:
Pembaruan :
Pisahkan acara dan pengikatan properti:
Anda juga bisa menggunakan
dan kemudian Anda tidak perlu memperbarui model di event handler, tapi saya yakin ini menyebabkan dua peristiwa diaktifkan, jadi mungkin kurang efisien.
Jawaban lama, sebelum mereka memperbaiki bug di beta.1:
Buat variabel template lokal dan lampirkan
(change)
acara:plunker
Lihat juga Bagaimana saya bisa mendapatkan pilihan baru di "pilih" di Angular 2?
sumber
ngModel
jika saya hanya mengikat variabel baru yang disebutitem
? Bukankah intinya membungkusngModel
dalam tanda kurung untuk mendapatkan event listener, jadi mengapa kita memperkenalkan variabel baru?selectedItem
adalah data terikat kami, yang diperbarui secara otomatis oleh NgModel untuk kami, tetapi ... itu tidak memberi tahu kami tentang perubahan, yang seringkali cukup baik (tampilan dan semacamnya akan diperbarui), tetapi jelas ini tidak cukup baik untuk kasus penggunaan Anda. Dalam pertanyaan SO lain yang saya rujuk, saya menjelaskan bagaimana saya mencoba menggunakan(ngModelChange)
untuk mendapatkan pemberitahuan perubahan, tetapi dipanggil dua kali untuk setiap perubahan. Saya tidak tahu apakah itu bug atau bukan. Bagaimanapun, menambahkan(change)
pengikatan acara tampaknya menyelesaikan masalah.selectedItem
tidak diperbarui saatonChange()
diaktifkan, oleh karena itu tampaknya kita membutuhkan variabel template lokal itu.#
atau#item
dalam kasus kami adalah referensi lokal . Karenanya mengapa kami bisa melakukannya diitem.change
sana.ngModelChange
acara khusus. Masalahnya, dengan<select>
, peristiwa ini terpicu dua kali untuk setiap perubahan.Saya telah menemukan pertanyaan ini dan saya akan mengirimkan jawaban saya yang saya gunakan dan bekerja dengan cukup baik. Saya memiliki kotak pencarian yang memfilter dan berbagai objek dan pada kotak pencarian saya, saya menggunakan
(ngModelChange)="onChange($event)"
di saya
.html
lalu di saya
component.ts
sumber
ngModelChange
,$event
bukanlah Peristiwa DOM . Melainkan nilai saat ini dari elemen formulir, yang merupakan string untuk elemen masukan.