mituri

[NG] validate group of checkboxes

Jul 25th, 2023
1,370
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TypeScript 1.50 KB | Source Code | 0 0
  1. HTML:
  2.  
  3.       <div style="background-color: darkkhaki">
  4.         <div>moviesForm: {{ moviesForm.valid }}</div>
  5.         <div>selectedMovies.selected: {{ selectedMovies.selected }}</div>
  6.         <div [formGroup]="moviesForm">
  7.           <div formArrayName="movies">
  8.             <mat-checkbox *ngFor="let movie of movies; let i = index" [formControlName]="i">
  9.               <div>{{ movie.title }}</div>
  10.             </mat-checkbox>
  11.           </div>
  12.  
  13.           <div *ngIf="moviesForm.controls.movies.errors?.atLeastOneCheckboxChecked">
  14.             Obie checkboxy muszą być zaznaczone.
  15.           </div>
  16.         </div>
  17.       </div>
  18.  
  19. TS:
  20.  
  21.     this.moviesForm = this.formBuilder.group({
  22.       movies: new FormArray([], this.atLeastOneCheckboxCheckedValidator()),
  23.     });
  24.  
  25.     const moviesArray = this.moviesForm.get('movies') as FormArray;
  26.     this.movies.forEach((movie) => {
  27.       const control = new FormControl(false); // domyślnie niezaznaczone
  28.       moviesArray.push(control);
  29.     });
  30.  
  31.    atLeastOneCheckboxCheckedValidator(): ValidatorFn {
  32.      return (control: FormArray): { [key: string]: any } | null => {
  33.        const checkboxes = control.controls;
  34.  
  35.        const checkedCheckboxes = checkboxes.filter((checkbox) => checkbox.value === true);
  36.  
  37.        if (checkedCheckboxes.length === checkboxes.length) {
  38.          return null; // oba checkboxy są zaznaczone, brak błędu walidacji
  39.        } else {
  40.          return { atLeastOneCheckboxChecked: true }; // błąd walidacji
  41.        }
  42.      };
  43.    }
  44.  
Advertisement
Add Comment
Please, Sign In to add comment