במאמר הקודם למדנו על יצירת Directives באנגולר, כעת נמשיך לנושא קצת יותר מורכב – טפסים.
יצירת טפסים באנגולר היא תהליך מרכזי בפיתוח אפליקציות ווב מתקדמות. במאמר זה נסקור את סוגי הטפסים השונים באנגולר, נלמד כיצד ליצור טפסים בצורה נכונה ויעילה, ונציג דוגמאות קוד מפורטות להמחשה.
סוגי טפסים באנגולר
באנגולר קיימים שני סוגים עיקריים של טפסים:
- Template-driven Forms: טפסים המוגדרים בתבנית (Template) של הקומפוננטה ומשתמשים ב-DOM לביצוע binding. הם פשוטים וקלים לשימוש.
- Reactive Forms: טפסים המוגדרים בקוד ה-TypeScript של הקומפוננטה. הם מספקים שליטה רבה יותר ומאפשרים ניהול מורכב של הטפסים והאימות שלהם.
יצירת Template-driven Form
ניצור טופס מבוסס תבנית פשוט שמקבל שם ודואר אלקטרוני:
שלב 1: הגדרת טופס בתבנית HTML
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
<label for="name">Name:</label>
<input type="text" id="name" name="name" ngModel>
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" ngModel>
<br>
<button type="submit">Submit</button>
</form>
שלב 2: ניהול הטופס בקומפוננטה
import { Component } from '@angular/core';
import { NgForm } from '@angular/forms';
@Component({
selector: 'app-template-form',
templateUrl: './template-form.component.html',
styleUrls: ['./template-form.component.css']
})
export class TemplateFormComponent {
onSubmit(form: NgForm) {
console.log('Form Submitted!', form.value);
}
}
יצירת Reactive Form
ניצור טופס מבוסס קוד שמקבל שם ודואר אלקטרוני:
שלב 1: הגדרת Reactive Form בקומפוננטה
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-reactive-form',
templateUrl: './reactive-form.component.html',
styleUrls: ['./reactive-form.component.css']
})
export class ReactiveFormComponent {
myForm = new FormGroup({
name: new FormControl('', [Validators.required]),
email: new FormControl('', [Validators.required, Validators.email])
});
onSubmit() {
console.log('Form Submitted!', this.myForm.value);
}
}
שלב 2: הגדרת טופס בתבנית HTML
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<label for="name">Name:</label>
<input type="text" id="name" formControlName="name">
<div *ngIf="myForm.get('name').invalid && myForm.get('name').touched">
Name is required.
</div>
<br>
<label for="email">Email:</label>
<input type="email" id="email" formControlName="email">
<div *ngIf="myForm.get('email').invalid && myForm.get('email').touched">
Enter a valid email.
</div>
<br>
<button type="submit" [disabled]="myForm.invalid">Submit</button>
</form>
אימות טפסים באנגולר
אימות טפסים הוא חלק חשוב ביצירת טפסים באנגולר. ניתן להוסיף אימות לטפסים בצורה קלה בעזרת Validators של אנגולר.
אימות בטפסים מבוססי תבנית
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
<label for="name">Name:</label>
<input type="text" id="name" name="name" ngModel required>
<div *ngIf="myForm.controls['name'].invalid && myForm.controls['name'].touched">
Name is required.
</div>
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" ngModel required email>
<div *ngIf="myForm.controls['email'].invalid && myForm.controls['email'].touched">
Enter a valid email.
</div>
<br>
<button type="submit" [disabled]="myForm.invalid">Submit</button>
</form>
אימות בטפסים מבוססי קוד
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-reactive-form',
templateUrl: './reactive-form.component.html',
styleUrls: ['./reactive-form.component.css']
})
export class ReactiveFormComponent {
myForm = new FormGroup({
name: new FormControl('', [Validators.required]),
email: new FormControl('', [Validators.required, Validators.email])
});
onSubmit() {
console.log('Form Submitted!', this.myForm.value);
}
}
שימוש בטפסים דינמיים באנגולר
טפסים דינמיים מאפשרים ליצור ולהוסיף שדות טופס באופן דינמי בקוד. נשתמש ב-FormArray כדי לממש זאת:
import { Component } from '@angular/core';
import { FormGroup, FormArray, FormControl } from '@angular/forms';
@Component({
selector: 'app-dynamic-form',
templateUrl: './dynamic-form.component.html',
styleUrls: ['./dynamic-form.component.css']
})
export class DynamicFormComponent {
myForm = new FormGroup({
fields: new FormArray([
new FormControl('Field 1'),
new FormControl('Field 2')
])
});
addField() {
(this.myForm.get('fields') as FormArray).push(new FormControl('New Field'));
}
onSubmit() {
console.log('Form Submitted!', this.myForm.value);
}
}
הגדרת טופס דינמי בתבנית HTML
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<div formArrayName="fields">
<div *ngFor="let field of myForm.get('fields').controls; let i = index">
<input [formControlName]="i">
</div>
</div>
<button type="button" (click)="addField()">Add Field</button>
<button type="submit">Submit</button>
</form>
ניהול שגיאות בטפסים באנגולר
בטפסים מורכבים, ניהול שגיאות הוא חלק חשוב לשיפור חוויית המשתמש. באנגולר, ניתן להוסיף ולנהל הודעות שגיאה בקלות באמצעות Validators ו-FormControl.
דוגמה לניהול שגיאות בטופס מבוסס קוד
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'app-error-handling-form',
templateUrl: './error-handling-form.component.html',
styleUrls: ['./error-handling-form.component.css']
})
export class ErrorHandlingFormComponent {
myForm = new FormGroup({
name: new FormControl('', [Validators.required]),
email: new FormControl('', [Validators.required, Validators.email])
});
get name() {
return this.myForm.get('name');
}
get email() {
return this.myForm.get('email');
}
onSubmit() {
console.log('Form Submitted!', this.myForm.value);
}
}
נשתמש בטופס בתבנית HTML להוספת הודעות שגיאה דינמיות:
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<label for="name">Name:</label>
<input type="text" id="name" formControlName="name">
<div *ngIf="name.invalid && (name.dirty || name.touched)">
<div *ngIf="name.errors.required">Name is required.</div>
</div>
<br>
<label for="email">Email:</label>
<input type="email" id="email" formControlName="email">
<div *ngIf="email.invalid && (email.dirty || email.touched)">
<div *ngIf="email.errors.required">Email is required.</div>
<div *ngIf="email.errors.email">Enter a valid email.</div>
</div>
<br>
<button type="submit" [disabled]="myForm.invalid">Submit</button>
</form>
סיכום
במאמר זה למדנו על סוגי הטפסים השונים באנגולר וכיצד ליצור ולנהל אותם בצורה יעילה. טפסים מבוססי תבנית וטפסים מבוססי קוד כל אחד מהם יש יתרונות וחסרונות, והבחירה ביניהם תלויה בצרכי הפרויקט והעדפות המפתח. ניהול שגיאות ואימות הם חלקים חשובים לשיפור חוויית המשתמש. אם אתם מעוניינים ללמוד בצורה מעמיקה יותר, אתם מוזמנים להתייעץ איתנו על קורס אנגולר.
במאמר הבא נלמד על ניהול אירועים – Events באפליקציית Angular.