Angular 动态表单组输入
Angular dynamic form group inputs
所以我有一个包含一些基本家庭信息的表格。然后我想有部分表格添加到children的家族中。我正在使用响应式表单,看起来像这样:
this.details = fb.group({
firstName: ['', Validators.required],
lastName: ['', Validators.required],
email: ['', Validators.compose([Validators.required, Validators.email])],
phone: ['', Validators.required]
});
现在,在 UI 中的某个时刻,将有 children 个名称的输入,并可选择添加更多。我可以通过编程方式向 this.details
组添加更多输入字段吗?
更新
@incognito 的回答非常适合我最初提出的问题。它将保留为选定的答案。在深入研究他的答案时,我还发现了 FormArray,这是我最终选择的方向,所以我想在这里添加它。看起来像:
this.form = this.fb.group({
...
children: this.fb.array([
this.fb.group({
name: ['', Validators.required],
age: ['', Validators.required],
gender: ['', Validators.required]
})
])
});
然后,视图如下所示:
<form [formGroup]="form">
<div *ngFor="let child of form.controls.children.controls; let i = index;"
formArrayName="children"
class="childForm">
<div [formGroupName]="i"
class="row">
<div class="col-md-4">
<input type="text"
class="form-control"
formControlName="name">
</div>
<div class="col-md-4">
<input type="number"
class="form-control"
formControlName="age">
</div>
<div class="col-md-4">
<select class="form-control"
formControlName="gender">
<option value="male">Male</option>
<option value="female">Female</option>
</select>
</div>
</div>
</div>
<button (click)="addChild()"
class="btn btn-primary">
<i class="fa fa-plus"></i> Add Another Child
</button>
</form>
表单底部按钮中引用的 addChild
函数如下所示:
addChild() {
const children = <FormArray>this.form.get('children');
children.push(this.fb.group({
name: [''],
age: [''],
gender: ['']
}));
}
所以,这又是一种不同的处理方式,我是在深入了解@incognito 的回答后才发现的。谢谢@incognito!
当然可以。实现可能会更好,但像这样:
<button (click)="addKid()"> Add kid </button
numberOfKids: number = 0;
addKid() {
this.numberOfKids++;
let input = this.renderer.createElement('input');
this.renderer.appendChild(form, input);
this.renderer.setProperty(input, 'formControlName', this.numberOfKids);
this.details.addControl(this.numberOfKids, new FormControl(''));
}
所以每个孩子的每个 formControl 都将被命名为一个数字。
此实现基于 Renderer2("directly" 操作 DOM 元素的推荐方式)
所以我有一个包含一些基本家庭信息的表格。然后我想有部分表格添加到children的家族中。我正在使用响应式表单,看起来像这样:
this.details = fb.group({
firstName: ['', Validators.required],
lastName: ['', Validators.required],
email: ['', Validators.compose([Validators.required, Validators.email])],
phone: ['', Validators.required]
});
现在,在 UI 中的某个时刻,将有 children 个名称的输入,并可选择添加更多。我可以通过编程方式向 this.details
组添加更多输入字段吗?
更新
@incognito 的回答非常适合我最初提出的问题。它将保留为选定的答案。在深入研究他的答案时,我还发现了 FormArray,这是我最终选择的方向,所以我想在这里添加它。看起来像:
this.form = this.fb.group({
...
children: this.fb.array([
this.fb.group({
name: ['', Validators.required],
age: ['', Validators.required],
gender: ['', Validators.required]
})
])
});
然后,视图如下所示:
<form [formGroup]="form">
<div *ngFor="let child of form.controls.children.controls; let i = index;"
formArrayName="children"
class="childForm">
<div [formGroupName]="i"
class="row">
<div class="col-md-4">
<input type="text"
class="form-control"
formControlName="name">
</div>
<div class="col-md-4">
<input type="number"
class="form-control"
formControlName="age">
</div>
<div class="col-md-4">
<select class="form-control"
formControlName="gender">
<option value="male">Male</option>
<option value="female">Female</option>
</select>
</div>
</div>
</div>
<button (click)="addChild()"
class="btn btn-primary">
<i class="fa fa-plus"></i> Add Another Child
</button>
</form>
表单底部按钮中引用的 addChild
函数如下所示:
addChild() {
const children = <FormArray>this.form.get('children');
children.push(this.fb.group({
name: [''],
age: [''],
gender: ['']
}));
}
所以,这又是一种不同的处理方式,我是在深入了解@incognito 的回答后才发现的。谢谢@incognito!
当然可以。实现可能会更好,但像这样:
<button (click)="addKid()"> Add kid </button
numberOfKids: number = 0;
addKid() {
this.numberOfKids++;
let input = this.renderer.createElement('input');
this.renderer.appendChild(form, input);
this.renderer.setProperty(input, 'formControlName', this.numberOfKids);
this.details.addControl(this.numberOfKids, new FormControl(''));
}
所以每个孩子的每个 formControl 都将被命名为一个数字。
此实现基于 Renderer2("directly" 操作 DOM 元素的推荐方式)