Angular 嵌套 FormGroup 中带有 FormArray 的反应式表单

Angular Reactive Forms with FormArray inside a nested FormGroup

我找到了很多例子,还有其他已回答的问题。包括 看起来很清楚,但我仍然无法使我的案例奏效。

我有以下 Angular 反应形式(如果我与链接问题的答案进行比较,这似乎没问题):

this.frm = this.fb.group({
  // ... a bunch of other groups
  // and then:

  custom_data: this.fb.group({
    pairs: this.fb.array([
      this.fb.group({
        custom_key: '',
        custom_value: ''
      })
    ]),
    expire_date: '',
    active: ['', Validators.required]
  })
});

我无法让它在视图中呈现,无论我尝试了什么,我都会收到错误消息。这是我找到的 latest/current 段代码,在我找到所有其他答案和 google 结果之后:

<form [formGroup]="frm">

  <fieldset>
    <legend>Custom Data:</legend>

    <ng-container formGroupName="custom_data">
      <div class="row">

        <div formArrayName="pairs">
          <div *ngFor="let pair of custom_data.get('pairs').controls; let i = index">
            <div [formGroupName]="i">
              <input type="text" formControlName="custom_key" placeholder="Custom key" />
              <input type="text" formControlName="custom_value" placeholder="Custom value" />
            </div>
          </div>
        </div> <!-- / end FormArray -->

        <div class="col-xs-6">
          <div class="form-group">
            <label class="control-label">Expires</label>
            <input type="text" formControlName="expire_date" class="form-control" />
          </div>
        </div>

        <div class="col-xs-6">
          <div class="form-group">
            <label class="control-label">Active<sup>*</sup></label>
            <select formControlName="active" class="form-control">
              <option value="1">Yes</option>
              <option value="0">No</option>
            </select>
          </div>
        </div>

      </div>
    </ng-container>
  </fieldset>    
</form>

我已经尝试了以下所有方法,但都没有成功:

<div *ngFor="let pair of custom_data.get('pairs').controls; let i = index">

<div *ngFor="let pair of pairs.controls; let i = index">

<div *ngFor="let pair of frm.controls['custom_data'].get('pairs').controls; let i = index">

我什至不确定 FormArray 是一个控件还是一个组,或者它是什么,我发现的每一种用法都显得如此独特和复杂。

必须push到数组,可以查看这个link for example

所以我最终从头开始重做。 奇怪的是……事实证明我尝试的第三件事最终奏效了:

<div *ngFor="let pair of frm.controls['custom_data'].get('pairs').controls; let i = index">

不知道为什么第一次没有成功。

需要注意的一件事:我还发现在进行生产构建时出现错误。为了解决这个问题,我不得不在组件的 class:

中添加这个方法
myFormArray() {
  return this.frm.controls['custom_data'].get('pairs') as FormArray;
}

然后,在我的模板中,使用方法:

<div *ngFor="let pair of myFormArray().controls; let i = index">

(这真的很奇怪,如果你问我的话,应该没有必要......)