Apakah mungkin untuk membuat validator yang dapat menggunakan beberapa nilai untuk memutuskan apakah bidang saya valid?
misalnya jika metode kontak yang disukai pelanggan adalah melalui email maka bidang email harus diisi.
Terima kasih.
Diperbarui dengan kode contoh ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
danequalTo
metode dan dokumentasi yang baik!Jawaban:
Untuk mengulangi metode yang telah diposting orang lain, ini adalah cara saya membuat
FormGroup
validator yang tidak melibatkan banyak grup.Untuk contoh ini, cukup berikan nama kunci bidang
password
danconfirmPassword
.Untuk
Validators
mengambil parameter, mereka perlu mengembalikan afunction
denganFormGroup
atauFormControl
sebagai parameter. Dalam kasus ini, saya memvalidasi fileFormGroup
.Secara teknis, saya bisa memvalidasi dua nilai jika saya tahu kuncinya, tetapi saya lebih suka memberi nama saya
Validators
sama dengan kesalahan yang akan mereka kembalikan. Fungsi tersebut dapat dimodifikasi untuk mengambil parameter ketiga yang mewakili nama kunci dari kesalahan yang dikembalikan.Diperbarui 6 Desember 2016 (v2.2.4)
Contoh Lengkap: https://embed.plnkr.co/ukwCXm/
sumber
FormGroup
untuk menangani validasi multi-bidang daripada meletakkanValidator
semuanya.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
Saya mencoba ini tetapi tidak berhasil. Ada saran? @ DaveJawaban Dave sangat, sangat membantu. Namun, sedikit modifikasi mungkin bisa membantu beberapa orang.
Jika Anda perlu menambahkan kesalahan ke
Control
bidang, Anda dapat menyimpan konstruksi formulir dan validator yang sebenarnya:Alih-alih menyetel kesalahan pada
ControlGroup
, lakukan di bidang aktual sebagai berikut:sumber
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
dielse
cabang untuk membuatnya diperbarui dengan benar ketika perubahanpasswordInput
membuat data valid.TypeError: passwordConfirmationInput.validator is not a function
. Itu karena saya tidak secara eksplisit membuat FormControl dengan Validators.required. Saya membiarkan validator kosong dan sebagai gantinya menggunakan atribut "diperlukan" pada input.{[key: string]: any}
, yangsetErrors(...)
tidak kembali (lagi?). JugasetErrors(...)
menimpa setiap kesalahan yang sudah ada, jadi saya ditambahkan ke objek kesalahan saat ini seperti:let errors = formGroup.controls[passwordConfirmationKey].errors;
danif(!errors) errors={};
danerrors['notEquivalent'] = true;
danformGroup.controls[dateControlFirst].setErrors(errors);
Saat menerapkan validator untuk beberapa bidang formulir, Anda harus memastikan, bahwa validator dievaluasi ulang saat setiap kontrol formulir diperbarui. Sebagian besar contoh tidak memberikan solusi untuk skenario tersebut, tetapi ini sangat penting untuk konsistensi data dan perilaku yang benar.
Silakan lihat implementasi saya dari validator khusus untuk Angular 2, yang memperhitungkan hal ini: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
Saya menggunakan
otherControl.valueChanges.subscribe()
untuk mendengarkan perubahan dalam kontrol lain danthisControl.updateValueAndValidity()
untuk memicu putaran validasi lain saat kontrol lain diubah.Saya menyalin kode di bawah ini untuk referensi di masa mendatang:
match-other-validator.ts
Pemakaian
Inilah cara Anda menggunakannya dengan bentuk reaktif:
Validator terbaru lainnya dapat ditemukan di sini: moebius-mlm / ng-validators .
sumber
this
untuk? Sebenarnya, ada baiknya memiliki fungsi bernama untuk keperluan debugging.othercontrol.valuechanges.subscribe
tidak berhenti berlangganan di mana pun.valueChanges
observasi saatotherControl
akan dihancurkan, yang akan menyebabkan langganan juga dihentikan. Namun, kekhawatiran Anda bisa jadi valid. Saya akan menyarankan untuk men-debug kode ini secara menyeluruh dengan versi terbaru Angular menggunakan berbagai kasus uji. Harap laporkan kembali jika Anda menemukan masalah.Saya menggunakan Angular 2 RC.5 tetapi tidak dapat menemukan ControlGroup, berdasarkan jawaban yang membantu dari Dave. Saya menemukan bahwa FormGroup berfungsi sebagai gantinya. Jadi saya melakukan beberapa pembaruan kecil pada kode Dave, dan berpikir saya akan berbagi dengan orang lain.
Di file komponen Anda, tambahkan impor untuk FormGroup:
Tentukan masukan Anda jika Anda perlu mengakses kontrol formulir secara langsung:
Dalam konstruktor Anda, buat contoh formulir Anda:
Tambahkan fungsi matchingPasswords di kelas Anda:
Semoga ini bisa membantu mereka yang menggunakan RC.5. Perhatikan bahwa saya belum menguji RC.6.
sumber
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Banyak penggalian di sumber sudut tetapi saya telah menemukan cara yang lebih baik.
Bagian HTML untuk grup kata sandi
sumber
Untuk memperluas jawaban matthewdaniel karena itu tidak sepenuhnya benar. Berikut adalah beberapa contoh kode yang menunjukkan cara menetapkan validator dengan benar ke
ControlGroup
.Berikut adalah contoh yang berfungsi: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
sumber
ControlGroup
dihapus demiFormGroup
siapa pun yang melihat ini. Docs and Learn Angular2 ContohBerikut adalah opsi lain yang bisa saya dapatkan yang tidak bergantung pada keseluruhan atau sub
ControlGroup
tetapi terikat langsung ke masing-masingControl
.Masalah yang saya miliki adalah kontrol yang bergantung satu sama lain tidak secara hierarkis bersama sehingga saya tidak dapat membuat file
ControlGroup
. Selain itu, CSS saya telah diatur sehingga setiap kontrol akan memanfaatkan kelas sudut yang ada untuk menentukan apakah akan menampilkan gaya kesalahan, yang lebih rumit saat berurusan dengan validasi grup daripada validasi khusus kontrol. Mencoba untuk menentukan apakah satu kontrol valid tidak mungkin karena validasi terkait dengan kelompok kontrol dan bukan setiap kontrol individu.Dalam kasus saya, saya ingin nilai kotak pilih untuk menentukan apakah bidang lain akan diperlukan atau tidak.
Ini dibangun menggunakan Form Builder pada komponen. Untuk model pilih alih-alih langsung mengikatnya ke nilai objek permintaan, saya telah mengikatnya untuk mendapatkan / menyetel fungsi yang akan memungkinkan saya menangani peristiwa "saat diubah" untuk kontrol. Kemudian saya akan dapat mengatur validasi secara manual untuk kontrol lain tergantung pada nilai baru kontrol pilih.
Berikut adalah bagian tampilan yang relevan:
Bagian komponen yang relevan:
Dalam kasus saya, saya selalu memiliki validasi pola yang terkait dengan kontrol sehingga
validator
selalu diatur ke sesuatu tetapi saya pikir Anda dapat mengaturvalidator
ke nol jika Anda tidak memiliki validasi yang terkait dengan kontrol.UPDATE: Ada metode lain untuk menangkap perubahan model seperti
(ngModelChange)=changeFunctionName($event)
atau berlangganan perubahan nilai kontrol dengan menggunakanthis.form.controls["employee"].valueChanges.subscribe(data => ...))
sumber
Saya mencoba sebagian besar jawaban ini tetapi tidak ada yang berhasil untuk saya. Saya menemukan contoh yang berfungsi di sini https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
sumber
equalTo
Mencari ini juga dan akhirnya menggunakan dari paket validasi ng2 ( https://www.npmjs.com/package/ng2-validation )Berikut ini contohnya: Didorong Template:
Model Didorong:
Template:
sumber
Ini adalah versi saya yang saya gunakan untuk memastikan usia di satu bidang lebih besar atau sama dengan usia di bidang lain. Saya menggunakan grup formulir juga, jadi saya menggunakan
group.get
fungsi daripadagroup.controls[]
Dan di komponen:
sumber
Saya pikir taruhan terbaik Anda, untuk saat ini, adalah membuat grup formulir untuk memegang kendali Anda. Saat Anda membuat instance Control, berikan fungsi untuk memvalidasinya. contoh:
saya tahu ini sangat tergantung pada versi angularjs2 yang Anda jalankan. Ini telah diuji terhadap 2.0.0-alpha.46
Jika ada yang memiliki saran yang lebih baik seperti menulis validator khusus (yang mungkin merupakan cara terbaik untuk melakukannya), ini diterima.
EDIT
Anda juga dapat menggunakan ControlGroup dan memvalidasi grup itu secara keseluruhan.
Cukup edit pesan-pesan tersebut sesuai dengan domain Anda.
sumber
Jawaban Louis Cruz sangat membantu saya.
Untuk menyelesaikannya, tambahkan saja setErrors reset: return passwordConfirmationInput.setErrors (null);
Dan semuanya bekerja dengan baik!
Terimakasih,
Salam,
TGA
sumber
Angular 8 Contoh validasi pada bidang konfirmasi kata sandi
FYI: ini tidak akan memperbarui validasi pada kolom passwordConfirm jika kolom "password" utama diubah setelah validasi ini berlalu. Tapi, Anda dapat membatalkan bidang konfirmasi kata sandi saat pengguna mengetik di bidang kata sandi
register.component.ts
password-confirm-validator.ts
register.component.html
sumber
Saya akan menyarankan menggunakan perpustakaan
ng-form-rules
. Ini adalah pustaka yang luar biasa untuk membuat semua jenis formulir dengan logika validasi yang dipisahkan dari komponen dan yang dapat bergantung pada perubahan nilai dari area lain dalam formulir. Mereka memiliki dokumentasi , contoh , dan video hebat yang menunjukkan banyak fungsinya . Melakukan validasi seperti ini, apa yang Anda coba lakukan itu sepele.Anda dapat memeriksa README mereka untuk beberapa info tingkat tinggi dan contoh dasar.
sumber
Angular 4 kata sandi cocok dengan aturan validasi.
Jika Anda perlu bidang kontrol kesalahan maka Anda dapat melakukannya.
Maka kebutuhan Anda untuk mendeklarasikan metode ini dalam
constructor
metode Like as.Alih-alih menyetel kesalahan pada ControlGroup, lakukan di bidang aktual sebagai berikut:
Bagian HTML untuk grup kata sandi
sumber