angular - Contextual Information When Using an Angular Form Array
问题描述
I am working with an array in Reactive Forms and am trying to display some contextual information alongside the form controls. For example, a customer may have many addresses and I can quite easily display this array, but I would like to also display the address type, which is text and not a form control.
For example, I have the following data model:
const backingModel = {
addresses: [
{
name: 'Home',
zipCode: '76106'
},
{
name: 'Billing',
zipCode: '09210'
},
{
name: 'Shipping',
zipCode: '90210'
}
]
};
Which I then use to build a an array inside of a form group
this.formGroup = this.fb.group({
addresses: this.fb.array([
this.fb.group({
zipCode: [backingModel.addresses[0].zipCode, Validators.required]
}),
this.fb.group({
zipCode: [backingModel.addresses[1].zipCode, Validators.required],
}),
this.fb.group({
zipCode: [backingModel.addresses[2].zipCode, Validators.required]
})
])
});
The HTML to display this is
<form [formGroup]="formGroup">
<div formArrayName="addresses" *ngFor="let item of formGroup.get('addresses').controls; let i = index">
<div [formGroupName]="i">
<h3>???? How to get adress description </h3>
<input type="text" formControlName="zipCode" />
<hr />
</div>
</div>
</form>
In this example how would I pass in the address name so that I can use it in the form?
解决方案
您的 HTML 应如下所示:
<form [formGroup]="formGroup">
<div formArrayName="addresses" >
<div *ngFor="let item of backingModel.addresses; let i = index" [formGroupName]="i">
<h3>{{ item.name }}</h3>
<input type="text" formControlName="zipCode" />
<hr />
</div>
</div>
</form>
请注意,我正在迭代模型,而不是表单控件。
在您的 component.ts 文件中,您需要将您的设置formGroup
为如下所示:
this.formGroup = fb.group({
"addresses": fb.array([
fb.group({ "zipCode": fb.control('Home')}),
fb.group({ "zipCode": fb.control('Billing')}),
fb.group({ "zipCode": fb.control('Shipping')})
])
});
但是,这是硬编码的,所以改为使用 yourbackingModel
来生成:
this.formGroup = fb.group({
"addresses": fb.array(
this.backingModel.addresses.map(t =>
fb.group({ "zipCode": [t.zipCode, Validators.required] })
))
});
}
这是决赛component.ts
:
import { Component } from '@angular/core';
import { FormGroup, Validators, FormBuilder } from '@angular/forms';
@Component({
selector: 'cmp',
templateUrl: './cmp.component.html',
styleUrls: ['./cmp.component.css']
})
export class CmpComponent {
formGroup: FormGroup;
backingModel: any = {
addresses: [
{
name: 'Home',
zipCode: '76106'
},
{
name: 'Billing',
zipCode: '09210'
},
{
name: 'Shipping',
zipCode: '90210'
}
]
};
constructor(private fb: FormBuilder) {
this.formGroup = fb.group({
"addresses": fb.array(
this.backingModel.addresses.map(t =>
fb.group({ "zipCode": [t.zipCode, Validators.required] })
))
});
}
}
推荐阅读
- reactjs - 为什么我不能将道具分配给常量并渲染它
- javascript - 正则表达式匹配其 url 以 image.extention(png,jpg,...) 结尾的所有选项卡,包括本地文件 url(file:///)
- sql - 如何返回一个值在两个表中但另一个值仅在一个表中的值?
- python - 检索 AttributeError 的问题:“DataFrame”对象没有属性“Frame”
- r - 从起点到终点将excel导入R
- assembly - 从堆栈寄存器中弹出时,高 8 位寄存器会发生什么?
- unit-testing - JUnit 发布测试结果在 Azure DevOps 中不起作用
- apache - 如何将一个页面重定向到另一个页面,然后将所有剩余页面重定向到新站点
- qt - 如何在 Qt 数据库中使用 SqlCipher
- javascript - 如何在thymeleaf(java)中的模式/弹出窗口中放置服务器数据