3

我的 Angular 5 / Angular Material 应用程序中有这个 FormArray:

this.form = new FormGroup({    
    customerNumberContainers: new FormArray([
      new FormGroup({
        contactTenant: new FormControl('', [Validators.required, Validators.minLength(2)]),
        customerNumber: new FormControl('', [Validators.required, Validators.minLength(2)])
        }),
    ]),
...

其实我不知道如何运行这个FormArray。我试过这个

<form [formGroup]="form" (ngSubmit)="onSubmit()">
    <div formGroupName="customerNumberContainers">          
        <div *ngFor="let customerNumberContainer of form.controls['customerNumberContainers']; index as i">
            <mat-input-container class="full-width-input" style="min-width:100px;">
                 <input matInput placeholder="Tenant" formControlName="customerNumberContainer[i].contactTenant">
            </mat-input-container> 
            <mat-input-container class="full-width-input" style="min-width:100px;">
                 <input matInput placeholder="Customernumber" formControlName="customerNumberContainer[i].customerNumber">
            </mat-input-container> 
        </div>
    </div>
   ...
4

4 回答 4

5

实际上你应该怎么做是这样的:

有一个返回控件数组的方法

get customerNumberContainers(): FormArray {
    return this.form.get("customerNumberContainers") as FormArray;
    } 

您将使用变量i来管理数组中的表单组

<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div formArrayName="customerNumberContainers">          
    <div *ngFor="let customerNumberContainer of customerNumberContainers.controls; index as i" [formGroupName]="i">
        <mat-input-container class="full-width-input" style="min-width:100px;">
             <input matInput placeholder="Tenant" formControlName="contactTenant">
        </mat-input-container> 
        <mat-input-container class="full-width-input" style="min-width:100px;">
             <input matInput placeholder="Customernumber" formControlName="customerNumber">
        </mat-input-container> 
    </div>
</div>

...

您可以创建添加方法和删除方法来管理数组中的表单组

add(data?: any) {
   /// data is to set up values to your internal form (useful for edition)
        this.customerNumberContainers.push(this.fb.group({
         }))
    }

    remove(index: number) {
        this.customerNumberContainers.removeAt(index)
    }

我希望这对你有帮助

问候

于 2018-03-02T13:25:23.710 回答
1

改变你的

<div *ngFor="let customerNumberContainer of form.controls['customerNumberContainers']; index as i">

到:

<div *ngFor="let item of getControls(); let i = index">

并在您的 .ts 文件中添加:

getControls() {    
 const fa = this.form.get('customerNumberContainers') as FormArray;  return 
 fa.controls; 
}

最终结果应该是:

<form [formGroup]="form" (ngSubmit)="onSubmit()">
    <div formArrayName="customerNumberContainers">          
        <div *ngFor="let item of getControls(); let i = index">
           <div [formGroupName]="i">
            <mat-input-container class="full-width-input" style="min-
               width:100px;">
                 <input matInput placeholder="Tenant" formControlName="contactTenant">
            </mat-input-container> 
            <mat-input-container class="full-width-input" style="min-width:100px;">
                 <input matInput placeholder="Customernumber" formControlName="customerNumber">
            </mat-input-container> 
        </div>
    </div>...

希望这可以帮助 :)

于 2018-03-02T13:41:44.927 回答
1

看看工作演示

StackBlitz:演示

解释:

  1. 在 Angular 中使用 Form Array 需要做很多事情。请参阅Aligator.io博客文章。
  2. 当不使用方括号:formControlName="value"时,值表示字符串。
  3. 当使用方括号:[formControlName]="customerNumberContainer[i].contactTenant"时,变量被接受。
于 2018-03-02T13:46:43.277 回答
0

你会在表单数组中有多个 formGroups 吗?

this.form = new FormGroup({    
  customerNumberContainers: new FormArray([
    new FormControl('', [Validators.required, Validators.minLength(2)]),
    new FormControl('', [Validators.required, Validators.minLength(2)])
  ])
});

如果不是,这就是它的外观。请记住,当更改表单数组的值时,请使用常量

const arr = <FormArray>this.form;

然后你可以推,等等......

arr.push(new FormControl(''));

如果您不这样做,某些表单数组函数将无法工作。

于 2018-03-30T18:58:50.577 回答