Di Angular, saya mungkin memiliki bentuk yang terlihat seperti ini:
<ng-form>
<label>First Name</label>
<input type="text" ng-model="model.first_name">
<label>Last Name</label>
<input type="text" ng-model="model.last_name">
</ng-form>
Di dalam pengontrol yang sesuai, saya dapat dengan mudah melihat perubahan pada isi formulir itu seperti:
function($scope) {
$scope.model = {};
$scope.$watch('model', () => {
// Model has updated
}, true);
}
Berikut ini adalah contoh Angular pada JSFiddle .
Saya mengalami kesulitan mencari tahu cara menyelesaikan hal yang sama di Angular. Jelas, kita tidak lagi memiliki $scope
, $ rootScope. Tentunya ada metode di mana hal yang sama dapat dicapai?
Berikut adalah contoh sudut pada Plunker .
(ngModelChange)="onModelChange($event)"
atribut ke setiap input formulir untuk mencapai ini?Jawaban:
UPD. Jawaban dan demo diperbarui untuk menyelaraskan dengan Angular terbaru.
Anda bisa berlangganan ke seluruh perubahan formulir karena fakta bahwa FormGroup yang mewakili formulir menyediakan
valueChanges
properti yang merupakan contoh yang dapat Diperhatikan :Dalam hal ini Anda perlu membuat form secara manual menggunakan FormBuilder . Sesuatu seperti ini:
Lihat
valueChanges
beraksi dalam demo ini : http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p=previewsumber
valueChanges
emitor acara jika formulir itu hanya ditentukan di dalam templat? Dengan kata lain - dalam konstruktor komponen, apakah tidak mungkin untuk mendapatkan referensi ke formulir yang ditentukan hanya dalam templat komponen itu dan tidak dengan bantuan FormBuilder?@ViewChild()
. Lihat jawaban saya yang diperbarui.Jika Anda menggunakan
FormBuilder
, lihat jawaban @ dfsq.Jika Anda tidak menggunakan
FormBuilder
, ada dua cara untuk diberitahu tentang perubahan.Metode 1
Seperti dibahas dalam komentar pada pertanyaan, gunakan peristiwa yang mengikat pada setiap elemen input. Tambahkan ke templat Anda:
Kemudian di komponen Anda:
The Bentuk Halaman memiliki beberapa informasi tambahan tentang ngModel yang relevan di sini:
Dalam kasus Anda, saya kira Anda ingin melakukan sesuatu yang istimewa.
Metode 2
Tentukan variabel templat lokal dan setel ke
ngForm
.Gunakan ngControl pada elemen input.
Dapatkan referensi ke arahan NgForm formulir menggunakan @ViewChild, kemudian berlangganan ControlGroup NgForm untuk perubahan:
plunker
Untuk informasi lebih lanjut tentang Metode 2, lihat video Savkin .
Lihat juga @ jawaban Thierry untuk informasi lebih lanjut tentang apa yang dapat Anda lakukan dengan yang
valueChanges
dapat diamati (seperti melonggarkan / menunggu sedikit sebelum memproses perubahan).sumber
Untuk melengkapi sedikit lebih banyak jawaban hebat sebelumnya, Anda perlu menyadari bahwa bentuk leverage dapat diamati untuk mendeteksi dan menangani perubahan nilai. Itu sesuatu yang sangat penting dan kuat. Baik Mark dan dfsq menggambarkan aspek ini dalam jawaban mereka.
Dapat diamati tidak hanya menggunakan
subscribe
metode (sesuatu yang mirip denganthen
metode janji di Angular 1). Anda dapat melangkah lebih jauh jika diperlukan untuk mengimplementasikan beberapa rantai pemrosesan untuk data yang diperbarui dalam bentuk.Maksud saya Anda dapat menentukan pada level ini waktu debounce dengan
debounceTime
metode. Ini memungkinkan Anda untuk menunggu beberapa saat sebelum menangani perubahan dan menangani beberapa input dengan benar:Anda juga dapat langsung menyambungkan pemrosesan yang ingin Anda picu (beberapa asinkron misalnya) ketika nilai diperbarui. Misalnya, jika Anda ingin menangani nilai teks untuk memfilter daftar berdasarkan permintaan AJAX, Anda dapat memanfaatkan
switchMap
metode ini:Anda bahkan melangkah lebih jauh dengan menautkan hasil yang dapat diamati secara langsung ke properti komponen Anda:
dan tampilkan menggunakan
async
pipa:Hanya untuk mengatakan bahwa Anda perlu memikirkan cara untuk menangani formulir secara berbeda di Angular2 (cara yang jauh lebih kuat ;-)).
Semoga ini bisa membantu Anda, Thierry
sumber
Memperluas saran Mark ...
Metode 3
Terapkan deteksi perubahan "dalam" pada model. Keuntungannya terutama melibatkan penghindaran memasukkan aspek antarmuka pengguna ke dalam komponen; ini juga menangkap perubahan program yang dibuat pada model. Karena itu, akan membutuhkan kerja ekstra untuk mengimplementasikan hal-hal seperti debouncing seperti yang disarankan oleh Thierry, dan ini juga akan menangkap perubahan program Anda sendiri , jadi gunakan dengan hati-hati.
Coba di Plunker
sumber
Untuk
5+
versi sudut . Menempatkan versi membantu karena sudut membuat banyak perubahan.sumber
Saya berpikir tentang menggunakan metode (ngModelChange), kemudian berpikir tentang metode FormBuilder, dan akhirnya memilih variasi Metode 3. Ini menyimpan dekorasi template dengan atribut tambahan dan secara otomatis mengambil perubahan pada model - mengurangi kemungkinan melupakan sesuatu dengan Metode 1 atau 2.
Metode Penyederhanaan 3 sedikit ...
Anda bisa menambahkan batas waktu untuk hanya memanggil doSomething () setelah x jumlah milidetik untuk mensimulasikan debounce.
sumber