אחרי שהיצרנו והרכבנו את האובייקט הריאקטיבי בעזרת formBuilder .עכשיו כל שנותר לנו זה לבנות את הטופס הHTML. ולשייך ולהגדיר, בעזרת formControlName , וגם בעזרת FormGroup. את הפקדים בטופס.
הטופס בצד הHTM, בשלמותו (לפני ווליצדיות)
אמשיך להציג את אותה הדוגמה מהפוסט הקודם (הדוגמה הזו תלווה אותנו לאורך כל המיני קורס הזה של טפסים מגיבים באנגולר)
<form *ngIf="jobRegistrationForm" [formGroup]="jobRegistrationForm" (submit)="submit(jobRegistrationForm)"> <div class="form-group"> <label>שם מלא<span class="red-star">*</span></label> <input formControlName="fullName" type="text" value="" placeholder="הקלדו כאן" /> </div> <div class="form-group"> <label>מספר טלפון<span class="red-star">*</span></label> <div [formGroup]="jobRegistrationForm.get('phoneForm')" class="inner-group-phone"> <input formControlName="number" type="text" value="" placeholder="הקלדו כאן" /> <div class="prefix-container"> <button (click)="displayPrefixlist()" type="button" class="choose-prefix"></button> <ul *ngIf="showPrefix" class="prefix-list"> <li *ngFor="let prefix of prefixList"> <button (click)="choosenPrefix(prefix)" type="button" class="prefix">{{prefix}}</button> </li> </ul> <input type="text" formControlName="prefix" [attr.disabled]="true" value="" placeholder="000" /> </div> </div> </div> <div class="form-group"> <label>אימייל<span class="red-star">*</span></label> <div [formGroup]="jobRegistrationForm.get('emailForm')" class="inner-group-email"> <input formControlName="email" type="email" value="" placeholder="אימייל לראשונה"/> <input formControlName="reEmail" type="email" value="" placeholder="אימייל בשנית" /> </div> </div> <div class="form-group"> <label>סטטוס<span class="red-star">*</span></label> <div (change)="checkJobStatus()" class="radio-group"> <input type="radio" name="jobStatus" formControlName="jobStatus" [value]="true" /> <span class="radio-input-text">עובד</span></div> <div (change)="checkJobStatus()" class="radio-group"> <input type="radio" name="jobStatus" formControlName="jobStatus" [value]="false" /> <span class="radio-input-text">לא עובד</span></div> </div> <div *ngIf="dontHaveJobYet" class="form-group"> <label>מאיזה יום הפסקת לעבוד<span class="red-star">*</span></label> <input formControlName="lastDayJob" type="date" > </div> <div class="form-group"> <input type="checkbox" formControlName="termsApproved" /> <span>יש לאשר את תנאי השימוש<span class="red-star">*</span></span> </div> <button class="button-action">אני רוצה!</button> </form>
טופס זה אינו טופס בסיסי, יש בו סוגים שונים של אינפונטים ולכן מעט ארוך אבל בסה"כ טופס דיי בסיסי ולכן כדאי רגע לעבור עליו ולהבין מה קורה פה . אז נפרק אותו לכמה חלקים , למעשה נעשה "זום-אין" על הדברים החשובים
שלב ראשון : תגיד form
<form *ngIf="jobRegistrationForm" [formGroup]="jobRegistrationForm" (submit)="submit(jobRegistrationForm)">
זוהי התגיד הראשונה שבעצם מגדירה את הטופס. וכן באנגולר ושימוש ב-reactive form נשייך את formGroup שהגדרנו בקובץ TS. (שם ה form group בדוגמה הוא jobRegistrationForm)
עוד נרצה להוסיף submit שישלח את המידע שנקלטץ כאן אפשר לראות שאני מעביר דרך הפונקציה את הטופס ולאחר מכאן מדפיס לקונסול בשביל לראות את התוצאה אבל אין זה משנה אם אני מעביר את הטופס דרך הפונקציה או פשוט מדפיס ישירות מהTS .
עוד אפשר לראות שהתווסף ngIf . זה מכוון שבניית הטופס מוגדרת ב ngOnInit וכן בתחילת הריצה אין קיום למשתנים המוגדרים ב formControlName באיפונטים השונים.
שלב שני : הגדרת האינפוטים עם formControlName
<div class="form-group"> <label>שם מלא<span class="red-star">*</span></label> <input formControlName="fullName" type="text" value="" placeholder="הקלדו כאן" /> </div>
כל פקד שתרצו שהוא יקלט בטופס הטופס שלכם , יש להגדיר לו formControlName . כמו במקרה הזה . הגדרו את הפקד עם formControlName="fullName" כלומר הוא ישמר באובייקט על המפתח fullName.
הצצה ל-TS מהשיעור הקודם :
this.jobRegistrationForm = this.fb.group({ fullName: this.fb.control(''),
השם שהגדרתם ב formControlName . חייב להיות קיים באובייקט הריאקטיבי שלכם אחרת תקבלו שגיאה.
שלב שלישי : form group בתוך form group
כפי שלמדנו וראינו בשיעורים הקודמים יש חשיבות גבוהה למבנה הטופס שלכם ולכן הגדרנו גם פה בדוגמה כמה form group בתוך ה form group הראשי. זה על מנת לייצר הפרדה מוחלטת במידע ושכן גם תעזור לנו להתמודד עם פונקציונליות בהמשך (למשל וולידציות).
אז למעשה התהליך חוזר על עצמו רק שכן נצטרך להגדיר עוד formGroup בתוך הטופס. וכך נעשה זאת לדיב העוטף את השדות של האימיילים:
<div class="form-group"> <label>אימייל<span class="red-star">*</span></label> <div [formGroup]="jobRegistrationForm.get('emailForm')" class="inner-group-email"> <input formControlName="email" type="email" value="" placeholder="אימייל לראשונה"/> <input formControlName="reEmail" type="email" value="" placeholder="אימייל בשנית" /> </div> </div>
השתמשנו ב-get על מנת לטפוס את ה-formGroup בשם emailForm. וזהו . כמו כן את הפקדים יש להגדיר באופן רגיל לחלוטין, כמו בשלב הראשון.
הצצה לטופס ב TS : זה עטוף בטופס הראשי כמובן .
emailForm : this.fb.group({ email: [''], reEmail: [''] }),
ולסיכום בניית הטופס באנגולר בצד HTML
הבנייה בHTML היא לא פחות חשובה מהבניה של האובייקט עצמו. יש לבנות את הטופס בהתאם למבנה שהגדרתם מראש. וכפי שאפשר לראות יש דמיון (ואפילו חפיפה) במבנה בין הקבצים. ואם תיישמו עבמודה מסודרת ובניה נכונה בטפסים מגיבים. חייכם התניני קוד יהיו יפים יפים. 😁. בהצלחה.