Mi sono preso la libertà di migliorare AngularInDepth.com codice di , in modo che cerchi in modo ricorsivo anche gli input non validi in forme annidate. Sia che sia annidato da FormArray-s o FormGroup-s. Basta inserire il formGroup di primo livello e restituirà tutti i FormControls non validi.
È possibile eliminare alcuni dei controlli di tipo "instanceof", se si separa il controllo FormControl e l'aggiunta alla funzionalità di matrice non valida in una funzione separata. Ciò renderebbe la funzione molto più pulita, ma avevo bisogno di un'opzione globale, singola funzione per ottenere un array piatto di tutti i formControls non validi e questa è la soluzione!
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;
}
Solo per coloro che ne hanno bisogno, quindi non devono codificarlo da soli ..
Modifica n. 1
È stato richiesto che restituisca anche FormArray e FormGroup non validi, quindi se ne hai bisogno, usa questo codice
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;
}