Dengan AngularJS, saya dapat menggunakan ng-pristine
atau ng-dirty
untuk mendeteksi jika pengguna telah memasuki lapangan. Namun, saya ingin melakukan validasi sisi klien hanya setelah pengguna meninggalkan area lapangan. Ini karena ketika pengguna memasukkan bidang seperti email atau telepon, mereka akan selalu mendapatkan kesalahan sampai mereka selesai mengetik email lengkap mereka, dan ini bukan pengalaman pengguna yang optimal.
MEMPERBARUI:
Angular sekarang dikirimkan dengan acara blur khusus: https://docs.angularjs.org/api/ng/directive/ngBlur
Jawaban:
Angular 1.3 sekarang memiliki ng-model-options, dan Anda dapat menyetel opsi ke
{ 'updateOn': 'blur'}
misalnya, dan Anda bahkan dapat menolak, ketika penggunaan terlalu cepat, atau Anda ingin menyimpan beberapa operasi DOM yang mahal (seperti penulisan model ke beberapa tempat DOM dan Anda tidak ingin siklus $ digest terjadi pada setiap tombol mati)https://docs.angularjs.org/guide/forms#custom-triggers dan https://docs.angularjs.org/guide/forms#non-immediate-debounce-model-updates
Dan lepaskan
sumber
ng-change
acara sebelum pengguna meninggalkan lapangan. Misalnya, dalam kasus saya, saya meminta data baru dari API saya segera setelah bidang input valid, tetapi saya tidak ingin menampilkan pesan kesalahan segera karena tidak valid - saya hanya ingin melakukan ini jika tidak valid dan peristiwa blur terjadi.1.3.0 rc-3
dan tidak menyalachange
sampaiblur
, periksa ini: plnkr.co/edit/RivVU3r7xfHO1hUybqMu?p=previewDari versi 1.3.0 ini dapat dengan mudah dilakukan
$touched
, yang benar setelah pengguna meninggalkan lapangan.https://docs.angularjs.org/api/ng/type/ngModel.NgModelController
sumber
updateOn: 'default'
yang artinya, untuk masukan, tombol atas, dan untuk pilihan, pada perubahanSaya menyelesaikan ini dengan memperluas apa yang disarankan @jlmcdonald. Saya membuat arahan yang secara otomatis akan diterapkan ke semua elemen input dan pilih:
Ini akan menambah
has-focus
danhas-visited
mengklasifikasikan berbagai elemen saat pengguna memfokuskan / mengunjungi elemen. Anda kemudian dapat menambahkan kelas ini ke aturan CSS Anda untuk menunjukkan kesalahan validasi:Ini berfungsi dengan baik karena elemen masih mendapatkan $ properti tidak valid dll, tetapi CSS dapat digunakan untuk memberikan pengalaman yang lebih baik kepada pengguna.
sumber
formName.inputName.$dirty
. Saya sarankan mengedit direktif untuk menulis boolean serupaformName.inputName.$focused
, daripada menggunakan nama kelas untuk blur dan boolean untuk validasi.Saya berhasil melakukan ini dengan sedikit CSS yang cukup sederhana. Hal ini mengharuskan pesan kesalahan menjadi saudara dari input yang terkait dengannya, dan memiliki kelas
error
.Setelah memenuhi kedua persyaratan tersebut, ini akan menyembunyikan pesan kesalahan apa pun yang terkait dengan bidang input terfokus, sesuatu yang menurut saya harus dilakukan angularjs. Sepertinya pengawasan.
sumber
Ini tampaknya diterapkan sebagai standar dalam versi sudut yang lebih baru.
Kelas ng-untouched dan ng-touch ditetapkan masing-masing sebelum dan setelah pengguna memiliki fokus pada elemen yang divalidasi.
CSS
sumber
Mengenai solusi @ lambinator ... Saya mendapatkan kesalahan berikut di angular.js 1.2.4:
Saya tidak yakin apakah saya melakukan sesuatu yang salah atau jika ini adalah perubahan di Angular, tetapi menghapus
scope.$apply
pernyataan menyelesaikan masalah dan kelas / negara bagian masih diperbarui.Jika Anda juga melihat kesalahan ini, cobalah yang berikut ini:
sumber
Mungkin berhasil bagi Anda untuk menulis perintah khusus yang membungkus metode javascript blur () (dan menjalankan fungsi validasi saat dipicu); ada masalah Angular yang memiliki sampel (serta arahan umum yang dapat mengikat ke acara lain yang tidak didukung oleh Angular):
https://github.com/angular/angular.js/issues/1277
Jika Anda tidak ingin pergi ke rute itu, pilihan Anda yang lain adalah mengatur $ watch di lapangan, lagi-lagi memicu validasi saat bidang diisi.
sumber
Untuk mempelajari lebih lanjut jawaban yang diberikan, Anda dapat menyederhanakan pemberian tag input dengan menggunakan pseudo-class CSS3 dan hanya menandai bidang yang dikunjungi dengan kelas untuk menunda menampilkan kesalahan validasi hingga pengguna kehilangan fokus pada bidang:
(Contoh membutuhkan jQuery)
JavaScript
CSS
HTML
sumber
berdasarkan jawaban @nicolas .. Pure CSS harus triknya, itu hanya akan menampilkan pesan kesalahan pada blur
CSS
sumber
Berikut adalah contoh penggunaan ng-messages (tersedia dalam angular 1.3) dan custom directive.
Pesan validasi ditampilkan dalam mode blur untuk pertama kalinya pengguna meninggalkan kolom input, tetapi ketika dia mengoreksi nilainya, pesan validasi segera dihapus (tidak buram lagi).
JavaScript
HTML
PS. Jangan lupa untuk mendownload dan menyertakan ngMessages dalam modul Anda:
sumber
ng-model-options di AngularJS 1.3 (versi beta saat tulisan ini dibuat) didokumentasikan untuk mendukung {updateOn: 'blur'}. Untuk versi sebelumnya, sesuatu seperti berikut ini berhasil untuk saya:
Dengan template seperti ini:
sumber
Gunakan status bidang $ tersentuh Bidang telah disentuh untuk ini seperti yang ditunjukkan pada contoh di bawah ini.
sumber
Anda dapat secara dinamis menyetel kelas has-error css (dengan asumsi Anda menggunakan bootstrap) menggunakan ng-class dan properti pada lingkup pengontrol terkait:
plunkr: http://plnkr.co/edit/HYDlaTNThZE02VqXrUCH?p=info
HTML:
Pengontrol:
sumber
Jika Anda menggunakan bootstrap 3 dan lesscss, Anda dapat mengaktifkan validasi blur dengan sedikit cuplikan berikut:
sumber
outI menggunakan arahan. Ini kodenya:
Semua kontrol input saya memiliki elemen span sebagai elemen berikutnya, di mana pesan validasi saya ditampilkan dan direktif sebagai atribut ditambahkan ke setiap kontrol input.
Saya juga memiliki kelas css (opsional) .has-focus dan has-visiting di file css saya yang Anda lihat direferensikan dalam direktif.
CATATAN: ingatlah untuk menambahkan 'on-blur-val' persis seperti ini ke kontrol masukan Anda tanpa apostrof
sumber
Dengan menggunakan ng-focus Anda dapat mencapai tujuan Anda. Anda perlu memberikan fokus ng di bidang masukan Anda. Dan saat menulis turunan ng-show Anda, Anda harus menulis logika yang tidak sama juga. Seperti kode di bawah ini:
<input type="text" class="form-control" name="inputPhone" ng-model="demo.phoneNumber" required ng-focus> <div ng-show="demoForm.inputPhone.$dirty && demoForm.inputPhone.$invalid && !demoForm.inputPhone.$focused"></div>
sumber
Kita bisa menggunakan fungsi onfocus dan onblur. Sederhana dan terbaik.
Coba di sini:
http://plnkr.co/edit/NKCmyru3knQiShFZ96tp?p=preview
sumber