Tôi đã tự do cải thiện mã AngularInDepth.com -s, để nó cũng tìm kiếm đệ quy các đầu vào không hợp lệ trong các biểu mẫu lồng nhau. Chung nó được lồng vào nhau bởi FormArray-s hoặc FormGroup-s. Chỉ cần nhập formGroup cấp cao nhất và nó sẽ trả về tất cả các FormControl không hợp lệ.
Bạn có thể bỏ qua một số kiểm tra kiểu "instanceof", nếu bạn muốn tách kiểm tra FormControl và bổ sung chức năng mảng không hợp lệ thành một chức năng riêng biệt. Điều này sẽ làm cho hàm trông gọn gàng hơn rất nhiều, nhưng tôi cần một tùy chọn toàn cục, một hàm, để có được một mảng phẳng gồm tất cả các formControl không hợp lệ và đây là giải pháp!
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;
}
Chỉ dành cho những người cần nó, vì vậy họ không phải tự mã hóa nó ..
Chỉnh sửa # 1
Nó đã được yêu cầu rằng nó cũng trả về FormArray-s và FormGroups không hợp lệ, vì vậy nếu bạn cũng cần điều đó, hãy sử dụng mã này
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;
}