0
votes

I have to make a single submit.

But i will show the user 4 forms dynamically

    fields: any = [
        [
            { label: "firstname", name: "first" },
            { label: "lastname", name: "last" },
            { label: "Date", name: "fromDate", type: "date" },
            { label: "To Date", name: "toDate", type: "date" },
        ],
        [
            { label: "firstname", name: "first" },
            { label: "lastname", name: "last" },
            { label: "age", name: "age"},
            { label: "address", name: "add" },
        ],
        [
            { label: "firstname", name: "first" },
            { label: "lastname", name: "last" },
            { label: "mobile", name: "mob" },
        ],
    ]

now using these fields i made my html dynamic with multiple submit button. you may see they have sometimes same form control name, sometimes diff form control name.

name field inside obj, will actually been given to formControlName dynamically.

the problem is:

I have multiple forms in one page

Form 1 with submit button

Form 2 with submit button

Form 3 with submit button

Form 4 with submit button

These from have diffn control name & label but look similar so I made it dynamic

But problem is Formbuilder

How can I make that Dynamic.

1

1 Answers

0
votes

In order to build your form dynamically you should define FormGroup and build your form using formBuilder based on what you want, for example: Component.ts

import { FormGroup, FormBuilder, Validators, FormControl} from '@angular/forms';

  constructor(private formBuilder: FormBuilder) { }
  ngOnInit() {
      //Call the Create function
      this.createDynamicForm(this.formIndex);
  }
  public myFormGroup : FormGroup;
  formIndex = 0; // The index of fields array, Form you want to build
  fields: any = [
          [
              { label: "firstname", name: "first" },
              { label: "lastname", name: "last" },
              { label: "Date", name: "fromDate", type: "date" },
              { label: "To Date", name: "toDate", type: "date" },
          ],
          [
              { label: "firstname", name: "first" },
              { label: "lastname", name: "last" },
              { label: "age", name: "age"},
              { label: "address", name: "add" },
          ],
          [
              { label: "firstname", name: "first" },
              { label: "lastname", name: "last" },
              { label: "mobile", name: "mob" },
          ],
      ]

  private createDynamicForm(formIndex) { //create form based on fields array
    this.myFormGroup = this.formBuilder.group(this.createFormGroup(formIndex));
  }

  private createFormGroup(formIndex){ // define each field name and validator - defualt value ...etc
    var _group = {}
    for (var i = 0; i < this.fields[formIndex].length; ++i) {
      _group[this.fields[formIndex][i].name] = ['',Validators.required]
    }

    return _group;
  }

  submitDynamicForm(formIndex){  // I'm Just log the input @todo
    for (var i = 0; i < this.fields[formIndex].length; ++i) {
      console.log(this.fields[formIndex][i].name,this.myFormGroup.get([this.fields[formIndex][i].name]).value)
    }
  }

and your template should be like this

<form [formGroup]="myFormGroup" (ngSubmit)="submitDynamicForm(formIndex)">
    <div *ngFor="let inputField of fields[formIndex]">
        <input type="text" id="{{inputField.name}}_id" [formControlName]="inputField.name">
        <label for="{{inputField.name}}_id">{{inputField.label}}</label>
            </div>
        <input type="submit" [disabled]="!myFormGroup.valid" type="submit" value="submit">
 </form>