בלי Form builder, לכל שדה שאנחנו מגדירים צריכים להשתמש במילה new.
comp.ts
contactForm: FormGroup = new FormGroup({
presonalDetails: new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
email: new FormControl(''),
}),
message: new FormControl(''),
subjects: new FormArray([
new FormControl(null),
])
});
עם Form builder ההגדרה של הטופס נקייה יותר.
comp.ts
constructor(private formBuilder: FormBuilder){}
contactForm = this.formBuilder.group({
presonalDetails: this.formBuilder.group({
firstName: ['', Validators.required],
lastName: '',
email: '',
}),
message: ''
});
ngOnInit() {
}
כדי להשתמש ב-Form builder צריך לייבוא לתוך ה-app.module את הספרייה:
comp.ts
import{ FormsModule, ReactiveFormsModule} from'@angular/forms';
ולהוסיף אותה ל-import.
שדה select
כדי להוסיף שדה sekect עם ערכים בתוכו נגדיר את השדה בטופס שלנו:
comp.ts
constructor(private formBuilder: FormBuilder){}
public contactForm: FormGroup = new FormGroup({});
ngOnInit() {
this.contactForm = this.formBuilder.group({
firstName: ['', Validators.required],
country: ['', [Validators.required]],
});
}
get firstname() {
return this.contactForm.get('firstname');
}
get country() {
return this.contactForm.get('country');
}
countryList: country[] = [
new country("1", "India"),
new country('2', 'USA'),
new country('3', 'England')
];
export class country {
id: string;
name: string;
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
}
בטופס עצמו:
comp.html
<form [formGroup]="contactForm" (ngSubmit)="onSubmit()" novalidate>
<p>
<label for="firstname">First Name </label>
<input type="text" id="firstname" name="firstname" formControlName="firstname">
</p>
<div
*ngIf="!firstname?.valid && (firstname?.dirty ||firstname?.touched)">
<div [hidden]="!firstname.errors.required">
First Name is required
</div>
</div>
<p>
<label for="country">country </label>
<select id="country" name="country" formControlName="country">
<option [ngValue]="c.id" *ngFor="let c of countryList">
{{c.name}}
</option>
</select>
</p>
<div *ngIf="!country.valid && (country.dirty || country.touched)">
<div [hidden]="!country.errors.required">
country is required
</div>
</div>
<p>
<button type="submit" [disabled]="!contactForm.valid">Submit</button>
</p>
</form>
לבדיקת הסטטוס של הטופס אפשר לשים את הקוד הבא אחרי הטופס ב-html:
comp.html
<div style="float: right; width:50%;">
<h3>Form Status</h3>
<b>valid : </b>{{contactForm.valid}}
<b>invalid : </b>{{contactForm.invalid}}
<b>touched : </b>{{contactForm.touched}}
<b>untouched : </b>{{contactForm.untouched}}
<b>pristine : </b>{{contactForm.pristine}}
<b>dirty : </b>{{contactForm.dirty}}
<b>disabled : </b>{{contactForm.disabled}}
<b>enabled : </b>{{contactForm.enabled}}
<h3>Form Value</h3>
{{contactForm.value |json}}
</div>