如何将带有FormControls的FormGroup动态添加到FormGroup

时间:2019-08-22 13:34:36

标签: javascript angular

我有一个很大的表格,里面有很多复选框,收音机,文本区域... 整个表单是从数据库动态生成的。

有时,我需要验证一组复选框,其中必须选中该复选框组中的至少一个复选框。 因此,我遵循了本手册:https://stackoverflow.com/a/54036689/11937089

我的问题是,表单组内的表单组必须动态生成。

我尝试过这样的事情:

this.outerForm.addControl('checkboxGroup' + (foo.id + ' ')), new FormGroup({}));

foo.forEach(bar => { get('checkboxGroup' + (foo.id + ' ')).addControl('checkbox'+ (foo.id + ' ') + (bar.id + ' ')), new FormControl(' ')); }

但是我很确定这是完全错误的,因为addControl不适用于表单组,而且我也不知道如何在addControl-Part中引用动态FormGroup checkboxGroup1,get似乎是错误的。

outerform
--> textarea
--> checkboxGroup1
----->checkbox11
----->checkbox12
----->checkbox13
----->checkbox14
--> textarea
--> textarea
--> checkboxGroup2
----->checkbox21
----->checkbox22
----->checkbox23
----->checkbox24

3 个答案:

答案 0 :(得分:0)

尝试使用 formArray 这样的东西 https://stackblitz.com/edit/angular-form-array-example

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

@Component({
  selector: 'my-app',
  template: `
    <form [formGroup]="form">
      <input type="checkbox" formControlName="published"> Published
      <div *ngIf="form.controls.published.value">

        <h2>Credentials</h2>
        <button (click)="addCreds()">Add</button>

        <div formArrayName="credentials" *ngFor="let creds of form.controls.credentials?.value; let i = index">
          <ng-container [formGroupName]="i">
            <input placeholder="Username" formControlName="username">
            <input placeholder="Password" formControlName="password">
          </ng-container>
        </div>

      </div>
    </form>
  `,
})
export class AppComponent  {
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = this.fb.group({
      published: true,
      credentials: this.fb.array([]),
    });
  }

  addCreds() {
    const creds = this.form.controls.credentials as FormArray;
    creds.push(this.fb.group({
      username: '',
      password: '',
    }));
  }
}

答案 1 :(得分:0)

我自己解决了,我真的很近。 this.outerForm.addControl('checkboxGroup' + (foo.id + ' ')), new FormGroup({})); 效果很好。

get('checkboxGroup' + (foo.id + ' ')).addControl('checkbox'+ (foo.id + ' ') + (bar.id + ' ')), new FormControl(' ')); 还不完整。

(this.outerForm.get('checkboxGroup' + (foo.id + ' ')) as any).addControl('checkbox'+ (foo.id + ' ') + (bar.id + ' ')), new FormControl(' ')); 做到了。

答案 2 :(得分:0)

您可以使用@ angular / forms。因此,您可以使用FormGroup,FormArray,FormControl。 例如,请看看https://stackblitz.com/edit/angular-3x3tme?file=src/app/hello.component.ts