Začíname s Angularom – Dynamické formuláre + neoficiálne riešenie

Angular

V rámci reaktívnych formulárov som vytvoril video s názvom „Začíname s Angularom – Dynamické formuláre“. V tomto článku ešte pridám riešenie, ktoré je jednoduchšie a tiež funguje.

Keďže oficiálne riešenie uvedené v dokumentácii od Angularu sa mi zdalo trošku ťažkopádne, skúsil som ho o niečo zjednodušiť. V rámci prvotných testov mi formulár fungoval, takže je možné, že aj tento zjednodušený zápis dynamického formulára je plne funkčný. V prípade, že by ste zistili, že niečo na tomto riešení nefunguje, uveďte to do komentára.

Ak chcete spoznať len oficiálny spôsob tvorby dynamických formulárov, postup nájdete v tomto videu.

A teraz uvádzam zjednodušenú verziu. Do príkladov dávam len obsah súborov component.ts a component.html.

Obsah súboru component.ts

import { Component, OnInit } from '@angular/core';
import { FormArray, FormBuilder, Validators } from '@angular/forms';

@Component({
  selector: 'app-dynamic-forms2',
  templateUrl: './dynamic-forms2.component.html',
  styleUrls: ['./dynamic-forms2.component.css']
})
export class DynamicForms2Component implements OnInit {

  form: any = {};
  labels = ["Custom label 1", "Custom label 2", "Custom label 3", "Custom label 4"];

  constructor(private fb: FormBuilder) { }

  addField(label: string, value: string) {
    this.form.push(this.fb.control(value, Validators.required));
    this.labels.push(label);
  }

  ngOnInit(): void {

    let formControls = [];
    for (let i = 1; i < 5; i++) {
      formControls.push(this.fb.control('value ' + i, Validators.required));
    }

    this.form = this.fb.array(formControls);
    console.log(this.form.controls);
  }

  onSubmit() {
    console.log(this.form);
    console.log(this.form.value);
  }

}

Obsah súboru component.html

<form [formGroup]="form" (ngSubmit)="onSubmit()">
  <div class="form-group">
    <div *ngFor="let field of form.controls; let i = index">
      <label for="field-{{ i }}">{{ labels[i] }}</label>
      <input
        class="form-control"
        id="field-{{ i }}"
        type="text"
        [formControlName]="i"
      />
    </div>
  </div>
  <button type="submit" class="btn btn-primary" [disabled]="!form.valid">
    Submit
  </button>
</form>
<br />
<p>
  <label for="addFieldLabel">Field name</label>
  <input #addLabel id="addFieldName" type="text" />
  <label for="addField">Field value</label>
  <input #addValue id="addField" type="text" />

  <button
    (click)="addField(addLabel.value, addValue.value)"
    class="btn btn-primary"
  >
    Add field
  </button>
</p>
https://www.mldgroup.com

Vyštudovaný top manažér pôsobiaci najmä ako manažér, marketér, softvérový inžinier, konzultant, bloger, YouTuber a zatiaľ neúspešný hudobník a producent. V rámci praxe pôsobil v rôznych odvetviach na rôznych pozíciách v malých aj veľkých firmách, vrátane spoluprác a partnerstiev s významnými firmami či poradenskými spoločnosťami.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.