angular - Egenskapen 'controls' eksisterer ikke på typen 'AbstractControl'
Jeg prøver å implementere et ValidatorFn-grensesnitt, men jeg får et problem når jeg prøver å bruke 'controls'-egenskapen på en formGroup av typen 'AbstractControl', feilen er: "Eigenskapen 'controls' finnes ikke på typen 'AbstractControl'", Jeg forsøkte opprinnelig å sette formGroup som typen 'FormGroup', men dette førte til en rekke feil. Mitt ValidatorFn-grensesnitt er som følger:
1. import { FormGroup, ValidatorFn, AbstractControl } from '@angular/forms';
2. export function requireCheckboxesToBeCheckedValidator(minRequired = 1): ValidatorFn {
3. return function validate (formGroup: AbstractControl) {
4. let checked = 0;
5.
6. Object.keys(formGroup.controls).forEach(key => {
7. const control = formGroup.controls[key];
8.
9. if (control.value === true) {
10. checked ++;
11. }
12. });
13.
14. if (checked < minRequired) {
15. return {
16. requireOneCheckboxToBeChecked: true,
17. };
18. }
19.
20. return null;
21. };
22. }
Feilen oppstår når kontroll-egenskapen brukes på linje 6 og 7. Finnes det en løsning på dette når man bruker en formGroup av typen AbstractControl?
Svar #1
Du kan legge til en typevakt for å sikre at du har en FormGroup, og du kan også håndtere tilfeller når du bare har en FormControl eller en FormArray.
export function requireCheckboxesBeCheckedValidator(minRequired = 1): ValidatorFn {
return (formControl: AbstractControl) => {
let ctrls: AbstractControl[];
if (formControl instanceof FormGroup) {
ctrls = Object.values(formControl.controls);
} else if (formControl instanceof FormArray) {
ctrls = formControl.controls;
} else {
ctrls = [ctrls];
}
const checked = formControl.controls.filter(({ value }) => value === true);
return checked < minRequired ? { requireOneCheckboxToBeChecked: true } : null;
}
}
