Saya memiliki bentuk reaktif di Angular seperti di bawah ini:
this.AddCustomerForm = this.formBuilder.group({
Firstname: ['', Validators.required],
Lastname: ['', Validators.required],
Email: ['', Validators.required, Validators.pattern(this.EMAIL_REGEX)],
Picture: [''],
Username: ['', Validators.required],
Password: ['', Validators.required],
Address: ['', Validators.required],
Postcode: ['', Validators.required],
City: ['', Validators.required],
Country: ['', Validators.required]
});
createCustomer(currentCustomer: Customer)
{
if (!this.AddCustomerForm.valid)
{
//some app logic
}
}
this.AddCustomerForm.valid mengembalikan false, tetapi semuanya terlihat bagus.
Saya telah mencoba untuk menemukan dengan memeriksa properti status di koleksi kontrol. Tetapi saya bertanya-tanya apakah ada cara untuk menemukan yang tidak valid dan menampilkannya kepada pengguna?
Jawaban:
Anda cukup mengulang setiap kontrol dan memeriksa status:
public findInvalidControls() { const invalid = []; const controls = this.AddCustomerForm.controls; for (const name in controls) { if (controls[name].invalid) { invalid.push(name); } } return invalid; }
sumber
findInvalidControls()
mengembalikanmu?Saya baru saja mengatasi masalah ini: Setiap bidang formulir valid, tetapi formulir itu sendiri tidak valid.
Ternyata saya telah menetapkan 'Validator.required' pada FormArray di mana kontrol ditambahkan / dihapus secara dinamis. Jadi meskipun FormArray kosong, itu tetap diperlukan dan oleh karena itu formulir selalu tidak valid, bahkan jika setiap kontrol yang terlihat telah diisi dengan benar.
Saya tidak menemukan bagian yang tidak valid dari formulir, karena fungsi 'findInvalidControls' saya hanya memeriksa FormControl dan bukan FormGroup / FormArray. Jadi saya memperbaruinya sedikit:
sumber
Kontrol Angular yang tidak valid memiliki kelas CSS bernama 'ng-invalid' .
Di bawah DevTools di Chrome, pilih tab Console.
Dalam perintah tipe prompt konsol:
Outputnya harus seperti ini:
Dalam kasus ini, teks yang digarisbawahi adalah untuk kontrol formulir
listen-address
. Dan teks yang dilingkari:.ng-invalid
menunjukkan bahwa kontrol tidak valid.sumber
Baik bentuk dan semua kontrol Anda memperluas kelas sudut AbstractControl. Setiap implementasi memiliki aksesor ke kesalahan validasi.
Dokumen api berisi semua referensi https://angular.io/api/forms/AbstractControl
Sunting
Saya pikir aksesor kesalahan bekerja seperti ini namun tautan ke github ini menunjukkan bahwa ada beberapa orang lain yang berpikiran sama seperti yang saya lakukan https://github.com/angular/angular/issues/11530
Bagaimanapun, dengan menggunakan pengakses kontrol Anda dapat mengulangi semua formControls di formulir Anda.
sumber
Sekarang, di angular 9, Anda bisa menggunakan metode markAllAsTouched () untuk menampilkan validator kontrol yang tidak valid:
sumber
Jika Anda tidak memiliki banyak bidang dalam formulir, cukup F12 dan arahkan kursor ke kontrol, Anda akan dapat melihat munculan dengan nilai murni / tersentuh / valid bidang- "# fieldname.form-control.ng- untouched.ng-invalid ".
sumber
Saya pikir Anda harus mencoba menggunakan
this.form.updateValueAndValidity()
atau mencoba menjalankan metode yang sama di setiap kontrol.sumber
coba ini
sumber
Ini akan mencatat semua nama kontrol 😊
for (let el in this.ReactiveForm.controls) { if (this.ReactiveForm.controls[el].errors) { console.log(el) } }
Anda dapat membuat array atau string dari ini dan menampilkannya kepada pengguna
sumber
Saya mengambil kebebasan untuk meningkatkan kode AngularInDepth.com -s, sehingga secara rekursif mencari input yang tidak valid dalam bentuk bersarang juga. Apakah itu disarangkan oleh FormArray-s atau FormGroup-s. Cukup masukkan formGroup tingkat atas dan itu akan mengembalikan semua FormControls yang tidak valid.
Anda mungkin dapat menepis beberapa pemeriksaan jenis "instanceof", jika Anda akan memisahkan pemeriksaan FormControl dan menambahkan fungsi array yang tidak valid ke dalam fungsi terpisah. Ini akan membuat fungsi terlihat jauh lebih bersih, tetapi saya membutuhkan opsi global, fungsi tunggal, untuk mendapatkan array datar dari semua formControls yang tidak valid dan inilah solusinya!
Hanya untuk yang membutuhkan, jadi mereka tidak perlu mengkodekannya sendiri ..
Edit # 1
Itu diminta agar juga mengembalikan FormArray-s dan FormGroups yang tidak valid, jadi jika Anda membutuhkannya juga, gunakan kode ini
sumber
Anda dapat mencatat nilai formulir
console.log(this.addCustomerForm.value)
, itu akan menghibur semua nilai kontrol kemudian null atau bidang "" (kosong) menunjukkan kontrol tidak validsumber
Jika Anda ingin memeriksa apakah formulir tersebut valid atau tidak, dan tidak ingin membuat perubahan kode apa pun, Anda dapat mencoba menjalankan perintah berikut di Konsol Alat Pengembang Chrome. Pastikan aplikasi angular Anda menampilkan komponen yang menghosting formulir yang dimaksud.
ng.probe(document.querySelector("app-your-component-selector-name")).componentInstance;
Jangan lupa untuk mengganti nama pemilih komponen Anda pada perintah di atas.
Perintah ini akan mencantumkan semua variabel dari komponen Anda termasuk
AddCustomerForm
. Sekarang jika Anda memperluas ini, Anda akan melihat daftar semua kontrol Anda. Anda kemudian dapat memperluas setiap kontrol untuk memeriksa apakah itu valid atau tidak.sumber
Periksa nilai kontrol bentuk kosong atau nol di halaman html
Nilai kontrol formulir: {{formname.value | json}}sumber