Pozwoliłem sobie poprawić kod AngularInDepth.com -s, tak aby rekurencyjnie wyszukiwał również nieprawidłowe dane wejściowe w zagnieżdżonych formularzach. Czy będzie zagnieżdżony przez FormArray-s lub FormGroup-s. Po prostu wprowadź formGroup najwyższego poziomu, a zwróci wszystkie elementy FormControls, które są nieprawidłowe.
Możesz ewentualnie przejrzeć niektóre z kontroli typu „instanceof”, jeśli oddzieliłbyś kontrolę FormControl i dodanie do funkcji nieprawidłowej tablicy w osobnej funkcji. To sprawiłoby, że funkcja wyglądałaby o wiele bardziej czysto, ale potrzebowałem globalnej, pojedynczej funkcji, opcji, aby uzyskać płaską tablicę wszystkich nieprawidłowych formControls i to jest rozwiązanie!
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;
}
Tylko dla tych, którzy tego potrzebują, więc nie muszą sami kodować.
Edytuj nr 1
Zażądano, aby zwracał również nieprawidłowe FormArray-s i FormGroups, więc jeśli tego również potrzebujesz, użyj tego kodu
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;
}