J'ai pris la liberté d'améliorer le code AngularInDepth.com -s, afin qu'il recherche de manière récursive les entrées non valides dans les formes imbriquées également. Qu'il soit imbriqué par FormArray-s ou FormGroup-s. Entrez simplement le formGroup de niveau supérieur et il renverra tous les FormControls qui ne sont pas valides.
Vous pouvez éventuellement parcourir certains des contrôles de type "instanceof", si vous séparez le contrôle FormControl et l'ajout de fonctionnalités de tableau non valides dans une fonction distincte. Cela rendrait la fonction beaucoup plus propre, mais j'avais besoin d'une option globale et unique pour obtenir un tableau plat de tous les formControls invalides et c'est la solution!
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;
}
Juste pour ceux qui en ont besoin, afin qu'ils n'aient pas à le coder eux-mêmes.
Modifier # 1
Il a été demandé qu'il renvoie également FormArray-s et FormGroups invalides, donc si vous en avez également besoin, utilisez ce code
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;
}