javascript - Knytte inndata-kontroller til forskjellige elementer inne i FormArray


Jeg står overfor følgende problem og jeg er usikker på hvordan jeg skal løse det, her er et minimalt eksempel https://stackblitz.com/edit/angular-ivy-vwq15f .

I dette eksemplet prøver jeg å binde de to inndatafeltene (navn og kjønn)

  <div formArrayName="formArray" class="column">
<div [formGroupName]="inspectedForm">
  <h1>Input field for Person {{inspectedForm +1}}</h1>
  <label for="name">name</label>
  <input formControlName="name" type="text" class="input" placeholder="Name">
  <label for="gender">gender</label>
  <input formControlName="gender" >
</div>

dynamisk til et element inne i en FormArray. Ved å klikke på personen (Person #1) vil jeg kunne endre de spesifikke egenskapene til den personen med de oppgitte inndatafeltene. Løsningen bør kunne velge en person for å redigere egenskapene UTEN å generere nye inndatafelter.

Jeg antar at jeg på en eller annen måte må binde til formControlName til den spesifikke Input-en som [formControlName="blabla", men jeg er veldig usikker.

Tusen takk på forhånd :)

Min html ser slik ut

<form [formGroup]="parentForm">
  <div *ngFor="let rule of arrayForm.controls; let i = index" class="button is-fullwidth not-clickable">
    <button (click)="changeInspectedElement(i)">Person {{i +1}}</button>

  </div>
  <button (click)="addElement()">Add Element</button>
  <div formArrayName="formArray" class="column">
    <div [formGroupName]="inspectedForm">
      <h1>Input field for Person {{inspectedForm +1}}</h1>
      <label for="name">name</label>
      <input formControlName="name" type="text" class="input" placeholder="Name">
      <label for="gender">gender</label>
      <input formControlName="gender" >
    </div>
  </div>
</form>

<p>
  {{parentForm.value | json}}
</p>

Min .ts ser slik ut

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  parentForm: FormGroup
  inspectedForm: number = 0

  constructor(private _fb: FormBuilder,) {
    this.parentForm = this._fb.group({
      formArray: this._fb.array([
        this.createArrayForm()
      ])
    })
  }

  createArrayForm() {
    return this._fb.group({
      name: [''],
      gender: ['']
    })
  }

  changeInspectedElement(index) {
    let value = this.arrayForm.value[index]
    this.inspectedForm = index
  }

  addElement() {
    this.arrayForm.push(this.createArrayForm())
  }

  get arrayForm() {
    return this.parentForm.get('formArray') as FormArray
  }


}

Vennligst gi meg beskjed hvis det er noe som er uklart med spørsmålet mitt.

Svar #1

Du har en FormArray av FormGroup, så du kan lage en funksjon som returnerer denne FormGroup

  getGroup(index)
  {
    return (this.parentForm.get('formArray') as FormArray).at(index) as FormGroup
    //or using your function arrayForm
    //return this.arrayForm.at(index) as FormGroup

  }

Så du kan føle deg fri til å bruke denne funksjonen i html for å indikere FormGroup

<div [formGroup]="getGroup(inspectedForm)">
  <input formControlName="name" type="text" class="input" placeholder="Name">
  <input formControlName="gender" >

Ja, det er ikke nødvendig å bruke FormArray. Dessuten har .html-filen ingen referanse til parentForm. Vel, det eneste du trenger er at knappene dine endrer variabelen inspectedForm.

<button (click)="inspectedForm=i">Person {{i +1}}</button>

din forgreinede stackblitz