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!
findInvalidControls( _input: AbstractControl, _invalidControls: AbstractControl[] ): AbstractControl[] {
if ( ! _invalidControls ) _invalidControls = [];
if ( _input instanceof FormControl ) {
if ( _input.invalid ) _invalidControls.push( _input );
return _invalidControls;
}
if ( ! (_input instanceof FormArray) && ! (_input instanceof FormGroup) ) return _invalidControls;
const controls = _input.controls;
for (const name in controls) {
let control = controls[name];
switch( control.constructor.name )
{
case 'AbstractControl':
case 'FormControl':
if (control.invalid) _invalidControls.push( control );
break;
case 'FormArray':
(<FormArray> control ).controls.forEach( _control => _invalidControls = findInvalidControls( _control, _invalidControls ) );
break;
case 'FormGroup':
_invalidControls = findInvalidControls( control, _invalidControls );
break;
}
}
return _invalidControls;
}
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
findInvalidControls( _input: AbstractControl, _invalidControls: AbstractControl[] ): AbstractControl[] {
if ( ! _invalidControls ) _invalidControls = [];
if ( _input instanceof FormControl ) {
if ( _input.invalid ) _invalidControls.push( _input );
return _invalidControls;
}
if ( ! (_input instanceof FormArray) && ! (_input instanceof FormGroup) ) return _invalidControls;
const controls = _input.controls;
for (const name in controls) {
let control = controls[name];
if (control.invalid) _invalidControls.push( control );
switch( control.constructor.name )
{
case 'FormArray':
(<FormArray> control ).controls.forEach( _control => _invalidControls = findInvalidControls( _control, _invalidControls ) );
break;
case 'FormGroup':
_invalidControls = findInvalidControls( control, _invalidControls );
break;
}
}
return _invalidControls;
}