Saya memiliki input teks dan saya tidak ingin mengizinkan pengguna menggunakan spasi, dan semua yang diketik akan diubah menjadi huruf kecil.
Saya tahu saya tidak diizinkan menggunakan filter pada ng-model misalnya.
ng-model='tags | lowercase | no_spaces'
Saya melihat membuat direktif saya sendiri tetapi menambahkan fungsi ke $parsers
dan $formatters
tidak memperbarui input, hanya elemen lain yang ada ng-model
di dalamnya.
Bagaimana cara mengubah masukan yang saat ini saya ketik?
Pada dasarnya saya mencoba membuat fitur 'tag' yang berfungsi seperti yang ada di StackOverflow.
angularjs
angularjs-filter
dom-manipulation
angularjs-ng-model
Andrew WC Brown
sumber
sumber
Jawaban:
Saya akan menyarankan untuk melihat nilai model dan memperbaruinya setelah chage: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p=preview
Satu-satunya masalah yang menarik adalah dengan spasi: Dalam AngularJS 1.0.3 ng-model pada input secara otomatis memotong string, jadi itu tidak mendeteksi bahwa model diubah jika Anda menambahkan spasi di akhir atau di awal (jadi spasi tidak secara otomatis dihapus oleh saya. kode). Tetapi di 1.1.1 ada direktif 'ng-trim' yang memungkinkan untuk menonaktifkan fungsionalitas ini ( komit ). Jadi saya telah memutuskan untuk menggunakan 1.1.1 untuk mencapai fungsionalitas persis seperti yang Anda jelaskan dalam pertanyaan Anda.
sumber
$watch
memaksa pendengar dipanggil lagi. Dalam kasus sederhana (di mana filter Anda idempoten), Anda akan berakhir dengan filter yang dijalankan dua kali pada setiap modifikasi.Saya percaya bahwa maksud dari masukan AngularJS dan
ngModel
arahannya adalah bahwa masukan yang tidak valid tidak boleh berakhir di model . Model harus selalu valid. Masalah dengan model yang tidak valid adalah bahwa kami mungkin memiliki pengamat yang menembak dan mengambil tindakan (tidak pantas) berdasarkan model yang tidak valid.Seperti yang saya lihat, solusi yang tepat di sini adalah menyambungkan ke
$parsers
pipa dan memastikan bahwa masukan yang tidak valid tidak masuk ke dalam model. Saya tidak yakin bagaimana Anda mencoba mendekati sesuatu atau apa yang sebenarnya tidak berhasil untuk Anda,$parsers
tetapi berikut adalah arahan sederhana yang menyelesaikan masalah Anda (atau setidaknya pemahaman saya tentang masalah tersebut):Segera setelah direktif di atas dideklarasikan, dapat digunakan seperti ini:
Seperti dalam solusi yang diusulkan oleh @Valentyn Shybanov, kita perlu menggunakan
ng-trim
arahan jika kita ingin melarang spasi di awal / akhir input.Keuntungan dari pendekatan ini adalah 2 kali lipat:
sumber
modelCtrl.$setViewValue(transformedInput); modelCtrl.$render();
Useful akan ditautkan ke dokumentasi: docs.angularjs.org/api/ng.directive:ngModel.NgModelController Satu kata untuk "melindungi" solisi saya adalah bahwa properti cakupan dapat diubah tidak hanya dari tampilan dan cara saya menutupi ini. Jadi saya pikir itu tergantung pada situasi aktual bagaimana ruang lingkup dapat dimodifikasi.modelCtrl
adalah pengontrol yang dibutuhkan oleh direktif. (require 'ngModel'
)Solusi untuk masalah ini adalah dengan menerapkan filter pada sisi pengontrol:
$scope.tags = $filter('lowercase')($scope.tags);
Jangan lupa untuk mendeklarasikan
$filter
sebagai ketergantungan.sumber
Jika Anda menggunakan bidang input hanya baca, Anda dapat menggunakan nilai-ng dengan filter.
sebagai contoh:
sumber
Gunakan arahan yang menambahkan koleksi $ formatters dan $ parsers untuk memastikan bahwa transformasi dilakukan di kedua arah.
Lihat jawaban lain ini untuk lebih jelasnya termasuk tautan ke jsfiddle.
sumber
Saya memiliki masalah yang sama dan terbiasa
di handler saya, saya memanggil metode objectInScope untuk memodifikasi dirinya sendiri dengan benar (input kasar). Dalam kontroler saya telah memulai suatu tempat itu
Saya tahu ini tidak menggunakan filter atau pengamat mewah ... tapi sederhana dan bekerja dengan baik. Satu-satunya kekurangan ini adalah objectInScope dikirim dalam panggilan ke handler ...
sumber
Jika Anda melakukan validasi input asinkron yang kompleks, mungkin ada baiknya untuk mengabstraksi
ng-model
satu level sebagai bagian dari kelas kustom dengan metode validasinya sendiri.https://plnkr.co/edit/gUnUjs0qHQwkq2vPZlpO?p=preview
html
kode
sumber
Anda bisa mencobanya
sumber