אחד הדברים ששימושיים בטפסים הוא נושא הוולידציות . באנגולר השקיעו הרבה מחשבה בטפסים ובוולידציות בפרט . אז היה טיפ שיעזור לכם להגדיר בטופס מסוג reactive form . וולידטור חדש ייחודי (ולא מובנה), לקבוצה של controllers. בדוגמה ניקח 3 צקבוקסים ונגדיר שלפחות אחד מהם צריך להיות מסומן.
צעד ראשון – להגדיר את השדות בHTML
אז להלן טופס פשוט שיש בו 4 צקבוקסים. אפשר לראות כי יש formControlName בכל אחד מהשדות כיעה ל angular reactive form . וכמובן לא לשכוח לציין את ה formGroup המתאים בתגית ה form
<form [formGroup]="checkboxesGroup" (ngSubmit)="submit(checkboxesGroup)"> <label>איזו חיית מחמד יש לך?</label> <div class="form-group"> <div class="input-group"> <input type="checkbox" formControlName="iHaveADog" name="Dog" /> <label>כלב</label> </div> <div class="input-group"> <input type="checkbox" formControlName="iHaveACat" name="Cat" /> <label>חתול</label> </div> <div class="input-group"> <input type="checkbox" formControlName="iHaveAFish" name="Fish" /> <label>דג</label> </div> <div class="input-group"> <input type="checkbox" formControlName="iHaveAOther" name="iHaveAOther" /> <label>אחר</label> </div> </div> <button type="submit" [disabled]="!checkboxesGroup.valid">שלח טופס</button> </form>
צעד שני- להגדיר את השדות ב-reactive form שלכם.
פה אפשר לראות הגדרה של ה formGroup בעזרת formBuilder , אפשר כמובן ליצוק את זה השדות ישירות על ידי new FormGroup ואז להזין את הקונטרולרים. לשם הגוון בחרתי להציג כך:
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { CustomValidators } from '../validators/at-least-one-checkbox';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
public title = 'reactive-form';
private exampleForm: FormGroup;
public checkboxesGroup: any;
constructor(private fb: FormBuilder){
this.exampleForm = this.fb.group({
checkBoxes : this.fb.group({
iHaveADog : this.fb.control(false),
iHaveACat : this.fb.control(false),
iHaveAFish : this.fb.control(false),
iHaveAOther : this.fb.control(false)
})
});
this.checkboxesGroup = this.exampleForm.get('checkBoxes');
}
ngOnInit() :void {}
submit(form: FormGroup) :void{
if(form.valid) {
console.log(form.value)
}
}
}
צעד שלישי – בונים את הפונקציה של הוולידציה.
אוקי אז הנה החלק המעניין. אני מעדיף גם לפתוח קובץ חדש ולשים בתיקיה שיצרתם במיוחד בשביל הוולידטורים שלכם. למשל אפשר לפתוח תיקיה חדשה מקבילה ל assets בשם validators ושמה לפתוח קובץ חדש בשם של הוולידטור שלכם.
import {AbstractControl, FormGroup} from '@angular/forms';
export class CustomValidators {
static atListOneCheckbox(group: FormGroup) : {[key: string]:any} | null {
const validCheckOne : AbstractControl = group.get('iHaveADog');
const validCheckTwo : AbstractControl = group.get('iHaveACat');
const validCheckThree : AbstractControl = group.get('iHaveAFish');
const validCheckFour : AbstractControl = group.get('iHaveAOther');
if (validCheckOne.value || validCheckTwo.value || validCheckThree.value || validCheckFour.value) {
return null;
}else {
return {'invalid': true}
}
}
}צעד רביעי ואחרון – מוסיפים את הוולידטור החדש אל הקבוצה של הצק בוקסים
ועכשיו הקסם קורה! פשוט מגדירים ל form group וולידציה על ידי שימוש ב setValidators . אפשר כמובן להעביר ולידטור אחד או כמה בתוך מערך .
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { CustomValidators } from '../validators/at-least-one-checkbox';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
public title = 'reactive-form';
private exampleForm: FormGroup;
public checkboxesGroup: any;
constructor(private fb: FormBuilder){
this.exampleForm = this.fb.group({
checkBoxes : this.fb.group({
iHaveADog : this.fb.control(false),
iHaveACat : this.fb.control(false),
iHaveAFish : this.fb.control(false),
iHaveAOther : this.fb.control(false)
})
});
this.checkboxesGroup = this.exampleForm.get('checkBoxes');
// ****** הוספנו את זה *******
this.checkboxesGroup.setValidators(CustomValidators.atListOneCheckbox);
// *****
}
ngOnInit() :void {}
submit(form: FormGroup) :void{
if(form.valid) {
console.log(form.value)
}
}
}
מקווה שנהנתם :). בהצלחה.





