Я дозволив собі вдосконалити код AngularInDepth.com -s, щоб він також рекурсивно шукав недійсні введення у вкладених формах. Чи буде він вкладений у FormArray-s або FormGroup-s. Просто введіть форму GroupGroup верхнього рівня, і вона поверне всі недійсні формиControls.
Ви можете скинути деякі перевірки типу "instanceof", якщо б ви розділили перевірку FormControl та додавання до недійсних функцій масиву в окрему функцію. Це зробило б функцію набагато чистішою, але мені потрібна була глобальна, одна функція, опція, щоб отримати плоский масив усіх недійсних формControls, і це рішення!
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;
}
Тільки для тих, хто цього потребує, тому їм не потрібно кодувати це самостійно ..
Редагувати No1
Було запропоновано також повернути недійсні FormArray-s та FormGroups, тому, якщо вам це також потрібно, використовуйте цей код
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;
}