根据用户输入循环遍历表单数组
Loop through form array based on user input
我有 select 带有选项的菜单,如果用户 select 1 那么我必须显示一个表格,或者如果用户 select 2 我必须显示 2 个相同的表格但是如果我在这里在推 3 之后推 2 个表格,它总共显示 5 个表格。我到目前为止所做的尝试
<select (change)="selectedvalue($event.target.value)">
<option *ngFor="let num of number" [value]="num.num">{{num.num}}</option>
</select>
<br>
<br>
<div class="container">
<form [formGroup]="myForm">
<div formArrayName="addresses" >
<div *ngFor="let address of myForm.controls.addresses.controls; let i=index" class="panel panel-default">
<div [formGroupName]="i" class="myform">
<label>street</label>
<input type="text" class="form-control" formControlName="street"><br><br>
<label>postcode</label>
<input type="text" class="form-control" formControlName="postcode">
</div><br><br>
</div>
</div><br><br>
<pre>form value: <br>{{myForm.value | json}}</pre>
</form>
</div>
您可以在此处查看完整的工作示例https://stackblitz.com/edit/angular-bd8bsq?file=app%2Fapp.component.ts
提前致谢。
将您的代码修改为:
selectedvalue(e) {
const control = <FormArray>this.myForm.controls['addresses'];
this.clearFormArray(control);
for (var i = 0; i < e; i++) {
control.push(this.initAddress());
}
}
clearFormArray = (formArray: FormArray) => {
while (formArray.length !== 0) {
formArray.removeAt(0)
}
}
you will have to clear FormArray
before pushing elements in it.
您应该检查还有多少表格,然后追加剩余的表格数量。
selectedvalue(e) {
for (var i = 0; i < e; i++) {
const control = <FormArray>this.myForm.controls['addresses'];
control.push(this.initAddress());
}
}
在上面的方法中,你只是添加了更多的 2 个表单,而不是只添加 1 个,因为你已经有 1 个。
selectedvalue(e) {
let existingLen = <FormArray>this.myForm.controls['addresses'];
for (var i = 0; i < (e - existingLen.length); i++) {
const control = <FormArray>this.myForm.controls['addresses'];
control.push(this.initAddress());
}
}
这应该是你的方法。
注意:使用此方法,您还需要处理表单数量的减少。
Add/Remove 根据所选数字。下面的代码adds/removesforms
从末尾
if(e < control.length) {
for (let i = control.length - 1; i >= e ; i--) {
control.removeAt(i);
}
} else {
let moreRequired = e - control.length;
for (let i = 1; i <= moreRequired ; i++) {
control.push(this.initAddress());
}
}
我有 select 带有选项的菜单,如果用户 select 1 那么我必须显示一个表格,或者如果用户 select 2 我必须显示 2 个相同的表格但是如果我在这里在推 3 之后推 2 个表格,它总共显示 5 个表格。我到目前为止所做的尝试
<select (change)="selectedvalue($event.target.value)">
<option *ngFor="let num of number" [value]="num.num">{{num.num}}</option>
</select>
<br>
<br>
<div class="container">
<form [formGroup]="myForm">
<div formArrayName="addresses" >
<div *ngFor="let address of myForm.controls.addresses.controls; let i=index" class="panel panel-default">
<div [formGroupName]="i" class="myform">
<label>street</label>
<input type="text" class="form-control" formControlName="street"><br><br>
<label>postcode</label>
<input type="text" class="form-control" formControlName="postcode">
</div><br><br>
</div>
</div><br><br>
<pre>form value: <br>{{myForm.value | json}}</pre>
</form>
</div>
您可以在此处查看完整的工作示例https://stackblitz.com/edit/angular-bd8bsq?file=app%2Fapp.component.ts
提前致谢。
将您的代码修改为:
selectedvalue(e) {
const control = <FormArray>this.myForm.controls['addresses'];
this.clearFormArray(control);
for (var i = 0; i < e; i++) {
control.push(this.initAddress());
}
}
clearFormArray = (formArray: FormArray) => {
while (formArray.length !== 0) {
formArray.removeAt(0)
}
}
you will have to clear
FormArray
before pushing elements in it.
您应该检查还有多少表格,然后追加剩余的表格数量。
selectedvalue(e) {
for (var i = 0; i < e; i++) {
const control = <FormArray>this.myForm.controls['addresses'];
control.push(this.initAddress());
}
}
在上面的方法中,你只是添加了更多的 2 个表单,而不是只添加 1 个,因为你已经有 1 个。
selectedvalue(e) {
let existingLen = <FormArray>this.myForm.controls['addresses'];
for (var i = 0; i < (e - existingLen.length); i++) {
const control = <FormArray>this.myForm.controls['addresses'];
control.push(this.initAddress());
}
}
这应该是你的方法。
注意:使用此方法,您还需要处理表单数量的减少。
Add/Remove 根据所选数字。下面的代码adds/removesforms
从末尾
if(e < control.length) {
for (let i = control.length - 1; i >= e ; i--) {
control.removeAt(i);
}
} else {
let moreRequired = e - control.length;
for (let i = 1; i <= moreRequired ; i++) {
control.push(this.initAddress());
}
}