Ich habe mir erlaubt , den AngularInDepth.com- Code so zu verbessern , dass er auch in verschachtelten Formen rekursiv nach ungültigen Eingaben sucht. Ob es von FormArray-s oder FormGroup-s verschachtelt wird. Geben Sie einfach die oberste FormGroup ein und es werden alle ungültigen FormControls zurückgegeben.
Sie können möglicherweise einige der Typprüfungen "instanceof" überfliegen, wenn Sie die FormControl-Prüfung und die Hinzufügung zu ungültigen Array-Funktionen in eine separate Funktion trennen würden. Dies würde die Funktion viel sauberer aussehen lassen, aber ich brauchte eine globale Option mit einer einzigen Funktion, um ein flaches Array aller ungültigen formControls zu erhalten, und dies ist die Lösung!
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;
}
Nur für diejenigen, die es brauchen, damit sie es nicht selbst codieren müssen.
Bearbeiten Sie # 1
Es wurde angefordert, dass auch ungültige FormArray-s und FormGroups zurückgegeben werden. Wenn Sie dies ebenfalls benötigen, verwenden Sie diesen 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;
}