קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
ראשי ♦ אנגולר ♦ convert array of objects to formArray in angular reactive form

convert array of objects to formArray in angular reactive form

עידן יצחקי 17 בדצמבר 2021 אין תגובות

קרה לכם שרציתם להעביר מערך של מידע שהגיע מהשרת למערך של רכיבים בתוך טופס כדי שהמשתמש יוכל לשנות אותם ולשלוח חזרה לשרת?

בטוח שזה קרה לכם 🤣, אם לא, אז זה עוד יקרה.

בואו נראה איך עושים את זה ואחרי זה נעבור על השורות ונבין מה קורה שם:

תחילה נבין את ההגיון ואת הקשר בין המידע לטופס

 @Input() externalLinksData: IExternalLinksInfo[] = [ // formArray
    {                                 // formGroup
      link: 'https://www.google.com', // formControl
      title: 'www.google.com',        // formControl
      id: '1q'                        // formControl
    },
    {                                  // formGroup
      link: 'https://www.walla.co.il', // formControl
      title: 'walla',                  // formControl
      id: '2w'                         // formControl
    },
    {                                 // formGroup
      link: 'https://www.ynet.co.il', // formControl
      title: 'ynet',                  // formControl
      id: '3e'                        // formControl
    },
    {                                 // formGroup
      link: 'https://www.ynet.co.il', // formControl
      title: 'ynet!!',                // formControl
      id: '4r'                        // formControl
    },
  ];

אם נסתכל על הדברים ככה, זה הרבה יותר מובן איך לבנות את הטופס.

  • המערך = formArray
  • כל אובייקט במערך = formGroup
  • כל מפתח (KEY) במערך = formControl

כמובן שהאובייטים יכולים להיות מסובכים יותר, אבל אם תעבדו ככה תראו שזה הגיוני ולא קשה בכלל.

עכשיו נראה את כל הרכיב

export class PopupExternalLinksComponent implements OnInit {
  @Input() externalLinksData: IExternalLinksInfo[] = [ // formArray
    {                                 // formGroup
      link: 'https://www.google.com', // formControl
      title: 'www.google.com',        // formControl
      id: '1q'                        // formControl
    },
    {                                  // formGroup
      link: 'https://www.walla.co.il', // formControl
      title: 'walla',                  // formControl
      id: '2w'                         // formControl
    },
    {                                 // formGroup
      link: 'https://www.ynet.co.il', // formControl
      title: 'ynet',                  // formControl
      id: '3e'                        // formControl
    },
    {                                 // formGroup
      link: 'https://www.ynet.co.il', // formControl
      title: 'ynet!!',                // formControl
      id: '4r'                        // formControl
    },
  ];
  private newExternalLinksData: IExternalLinksInfo[] = [];
  private delExternalLinksData: IExternalLinksInfo[] = [];
  @Output() closeEmitter: EventEmitter<boolean> = new EventEmitter<boolean>();
  @Output() saveEmitter: EventEmitter<IExternalLinksInfo[]> = new EventEmitter<IExternalLinksInfo[]>();
  @Output() deletedLinksEmitter: EventEmitter<IExternalLinksInfo[]> = new EventEmitter<IExternalLinksInfo[]>();
  form: FormGroup = {} as FormGroup;
  get links(): FormArray {
    const linksData = this.form.get("links") as FormArray;
    return linksData;
  }
  constructor(private fb: FormBuilder) { }

  ngOnInit(): void {
    this.newExternalLinksData = [...this.externalLinksData];
    this.form = new FormGroup({
      links: this.fb.array(this.newExternalLinksData.map(item => {
        return this.fb.group({
          title: new FormControl(item.title, { validators: [Validators.required] }),
          link: new FormControl(item.link, { validators: [Validators.required] }),
          id: new FormControl(item.id),
        });
      })),
    });
  }
  onAdd() {
    const linksData = this.form.get("links") as FormArray;
    linksData.push(new FormGroup({
      title: new FormControl('', { validators: [Validators.required] }),
      link: new FormControl('', { validators: [Validators.required] }),
      id: new FormControl(''),
    }))
  }
  onDelete(idx: number) {
    const linksData = this.form.get("links") as FormArray;
    if (linksData.controls[idx].value['id'] !== '') {
      this.delExternalLinksData.push(linksData.controls[idx].value)
    }
    linksData.removeAt(idx);
  }
  onCancel() {
    this.closeEmitter.emit(false);
  }
  onSave() {
    if (this.form.valid) {
      this.saveEmitter.emit(this.form.value);
      if (this.delExternalLinksData.length > 0) {
        this.deletedLinksEmitter.emit(this.delExternalLinksData);
      }
    }
  }

}
 <main class="main">
        <form [formGroup]="form">
            <ul class="links-list" formArrayName="links">
                <li class="links-item" *ngFor="let linkInfo of links.controls;index as idx">
                    <div [formGroupName]="idx">
                        <label class="label">
                            כותרת:
                            <input type="text" class="normal-input" formControlName="title">
                        </label>
                        <label class="label">
                            קישור:
                            <input type="text" class="normal-input" formControlName="link">
                        </label>
                        <button class="links-delete" type="button" aria-label="מחק"
                            (click)="onDelete(idx)">מחק</button>
                    </div>
                </li>
                <li class="add-more"><button type="button" (click)="onAdd()">הוספה</button></li>
            </ul>
            <div class="sub-footer">
                <div class="action-wrapper">
                    <button class="submit" type="button" (click)="onSave()" [disabled]="!form.valid">אישור</button>
                    <button class="cancel" type="button" (click)="onCancel()">ביטול</button>
                </div>
            </div>
        </form>
    </main>

רכיב זה מציג רשימת לינקים שמגיעה מה-"אבא", ניתן לערוך את הלינקים ואת השם שלהם, למחוק אותם וליצור חדשים.

בסיום, אנחנו שולחים את כל הלינקים ובנוסף מבצעים שליחה של הלינקים שיש למחוק מבסיס הנתונים.

בשורה 38 אנחנו מגדירים את ה-form שלנו כקבוצה שמכילה מזהה אחד בשם links.

בשורה 39 אנחנו מגדירים ש-links הוא מערך מסוג formArray , במקרה שלנו, אנחנו משתמשים ב-formBuilder ולכן אנחנו כותבים את זה כך – this.fb.array.

בנוסף אנחנו רצים על המידע שלנו בעזרת map ומחזירים פורמט מתאים לטופס, זאת אומרת, שכל אובייקט הופך ל-formGroup וכל key הופך ל-formControl.

שורה 40 מחזירה את האובייקט בצורה החדשה שלו.

שורות 41-43 הופכות כל KEY ל-CONTROL מתאים שיכול לתקשר עם הטופס ועם ה-HTML.

שימו לב שהמבנה נשאר זהה ב-HTML:

שורה 2 מגדירה את הטופס שלנו

שורה 3 מגדירה את ה-ul כמערך בטופס בשם links

שורה 4 עושה לולאה על links (על המערך שבו controls)

שורה 5 מגדירה קבוצה על פי הערך של idx (כמו לפנות לתא במערך)

שורות 8,12 מבצעות קשר ל-control על פי השם שלו

בשורה 18 יש לנו כפתור הוספה שבכל לחיצה הולך ל-TS ומפעיל פונקציה שמושכת את המערך של ה-formGroups ומוסיפה לו אחד נוסף..

כל פעם ש-linksData משתנה , הלולאה ngFor רצה שוב ומרעננת את הנתונים.

לסיכום:

אנחנו יכולים לראות שמבנה הנתונים, מבנה הטופס ב-TS ומבנה הטופס ב-HTML די תואמים אחד לשני.

זה אומר שבמקרים יותר מסובכים צריך רק להבין מה חלוקת המבנה ואיך להמיר אותו למבנה הטופס.

פוסטים קשורים:

custom validator for group angularcustom validator for groups – אנגולר ולידטור ייחודי לגרופ ב-reactive form מדריך אנגולגר טופס ריאקטיבי שיעור 2מדריך אנגולר | reactive forms – היכרות בסיסית עם AbstractControl מדריך אנגולגר טופס ריאקטיבימדריך אנגולר reactive form – יוצאים לדרך. תמונת אווירה של שמירה בענןImage file upload with preview in reactive form
angular reactive form אנגולר מדריך אנגולר

אודות המחבר

עידן יצחקי להציג את כל הפוסטים של עידן יצחקי


« פוסט קודם
פוסט הבא »

השארת תגובה

ביטול

חיפוש באתר
בחירת העורכים
29 בדצמבר 2023 עידן יצחקי

שדה טקסט עשיר עם תמונות

אתם הולכים להיות מופתעים עד כמה HTML יכול להיות חכם ולבצע משהו כל כך מורכב, שאם אנחנו היינו רוצים ליצור

1 באוקטובר 2021 עידן יצחקי

איך למשוך דינמית favicon של אתרים אחרים ב-JS

בפוסט זה נראה איך אפשר על פי לינקים בדף למשוך את ה-favicon מהדומיין שלהם באופן דינמי, בדיקה של תקינות התמונה

פופולרי
Javascript functions – היכרות עם סוגי פונקציות
Javascript
21 בדצמבר 2024 אין תגובות
Nested routing in angular standalone component
Typescript
15 בנובמבר 2024 תגובה אחת
בחרו לפי תגיות
angular blockchain css ethers express front-end fullstack GQL html javascript next js nextjs nodejs react hooks reactjs solidity webgl אנגולר בלוקציין וורדפרס לימודי אנגולר לימודי וורדפרס לימוד ריאקט מדריך front-end מדריך GQL מדריך אנגולר מדריך וורדפרס מדריך חינם react מדריך ריאקט מפתח בלוק מפתח בלוקציין מתכנת front-end מתכנת בלוקציין מתכנת פרונט סולידיטי קורס front end קורס fullstack קורס nextjs קורס אנגולר קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי קורס ריאקט קורס תכנות קורס תכנות בחינם
סינון על פי קטגוריות
CSS fullstack HTML IIS Javascript nodeJs SEO Typescript אנגולר בלוקציין בניית אתרים וורדפרס חיפוש עבודה כלים נוספים כללי נגישות קורסים ריאקט תלת מימד תקלות ופתרונות
צור קשר
כל הזכויות שמורות לקודקודייל
ליצירת קשר: @ קודקודייל
גלילה לראש העמוד