Angular - 错误错误:找不到名称为“s..Address”的控件

问题描述 投票:0回答:1

我在 HTML 中有以下组件:

<div>
    <form [formGroup]="dynamicFormGroup" (ngSubmit)="onSubmit()">
        <div class="form-row" *ngFor="let fields of AddressInfo.controls; let i = index" >
            <div class="form-group col-md-3" >
                <label for="password"><b>Street Address</b></label>
                <input type="text" class="form-control" placeholder="Street Address" name="SA" formControlName="streetAddress" />
              </div>
              <div class="form-group col-md-3" >
                <label for="password"><b>City</b></label>
                <input type="text" class="form-control" placeholder="City" name="city" formControlName="city" />
              </div>
              <div class="form-group col-md-3" >
                <label for="password"><b>State</b></label>
                <input type="text" class="form-control" placeholder="State" name="state" formControlName="state" />
              </div>
        </div>
        <br/>
     <button type="submit"  class="btn btn-primary">Submit</button>
    </form>
    <br/>
    <button type = "button" class="btn btn-primary" (click)="addNewAddress()" >Add New Address</button>
</div>    

<h4>OUTPUT</h4>
<div>{{output}}</div>

和.ts文件:

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

@Component({
  selector: 'app-dynamic-form',
  templateUrl: './dynamic-form.component.html',
  styleUrls: ['./dynamic-form.component.css'],
})
export class DynamicFormComponent implements OnInit {
  dynamicFormGroup!: FormGroup;
  output!: any;
  constructor(private formBuilder: FormBuilder) {}

  ngOnInit() {
    this.dynamicFormGroup = this.formBuilder.group({
      address: new FormArray([this.createItem]),
    });
  }

  addNewAddress(): void {
    (this.dynamicFormGroup.get('address') as FormArray).push(this.createItem);
  }

  get formControllers() {
    return this.dynamicFormGroup.controls;
  }

  get AddressInfo() {
    return this.formControllers['address'] as FormArray;
  }

  get createItem(): FormGroup {
    return this.formBuilder.group({
      streetAddress: [],
      city: [],
      state: [],
    });
  }
  onSubmit() {
    this.output = this.dynamicFormGroup.controls['address'].value;
    console.log(this.output);
  }
}

出现此错误:

错误错误:找不到名称为“streetAddress”的控件

错误错误:找不到名称为“city”的控件

错误错误:找不到名称为“state”的控件

使用此链接:

https://dev.to/mana95/how-to-handle-dynamic-form-fields-in-reactive-forms-in-angular-3c0f

https://codesandbox.io/p/devbox/hardcore-goldberg-ytsxn5?file=%2Fsrc%2Fapp%2Fdynamic-form%2Fdynamic-form.component.html%3A1%2C1-25%2C22

有什么解决办法吗?谢谢。

angular typescript angular-reactive-forms formarray formgroups
1个回答
1
投票

您的 HTML 响应式表单结构不正确:

  1. 缺少

    formArrayName="address"
    属性。

  2. 提到的控件应包装在 FormGroup 中。

<div
  class="form-row"
  formArrayName="address"
  *ngFor="let fields of AddressInfo.controls; let i = index"
>
  <ng-container [formGroupName]="i">
    <div class="form-group col-md-3">
      <label for="password"><b>Street Address</b></label>
      <input
        type="text"
        class="form-control"
        placeholder="Street Address"
        name="SA"
        formControlName="streetAddress"
      />
    </div>
    <div class="form-group col-md-3">
      <label for="password"><b>City</b></label>
      <input
        type="text"
        class="form-control"
        placeholder="City"
        name="city"
        formControlName="city"
      />
    </div>
    <div class="form-group col-md-3">
      <label for="password"><b>State</b></label>
      <input
        type="text"
        class="form-control"
        placeholder="State"
        name="state"
        formControlName="state"
      />
    </div>
  </ng-container>
</div>

演示@StackBlitz

© www.soinside.com 2019 - 2024. All rights reserved.