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;
  }
}

Relaterte artikler