angular - 在表单中显示联系人列表并允许用户添加新联系人
问题描述
已解决:感谢@Gourav - 我只需要将数据添加到我的表单中,如下所示:
buildFormDynamic(item: Item): FormGroup {
return this.fb.group({
data: [item && item.data],
});
}
更新:表单生成器代码显示正确;但是,问题似乎是 json 数据在首次加载时没有正确填充。
更新:我正在使用 Angular 8,我现在正在使用这个模拟 JSON 动态创建我的表单:
{
"data": {
"item": [
{
"data": "object property"
},
{
"data": "object property 2",
}
]
}
}
这个想法是表单将显示所有返回项目的联系部分;在这种情况下 3. 这是我动态构建它的方式:
private service: ItemService;
private items: Array;
itemForm: FormGroup;
constructor(private fb: FormBuilder, private service: ItemService)
{
this.service = service;
}
ngOnInit() {
this.items = this.service.getItems();
this.createForm();
}
createForm() {
let arr = [];
for (let i = 0; i < this.items.data.item.length; i++) {
arr.push(this.buildFormDynamic(this.items.data.item[i]));
}
this.itemForm = this.fb.group({
itemDetails: this.fb.array(arr)
});
}
buildFormDynamic(contact: Object): FormGroup {
return this.fb.group({
data: [""],
itemId: [""]
});
}
这是我更新的 HTML:
<form [formGroup]="itemForm" >
<div>
<div>
<input formControlName="isItem" type="radio" name="item" />
<input formControlName="isNotItem" type="radio" name="item" />
</div>
</div>
<div formArrayName="itemDetails"
*ngFor="
let contact of itemForm.controls.items.controls[i]
.controls;
let i = index
">
<div formGroupName="{{ i }}">
<div>
<input formControlName="name" type="text" id="itemName" />
</div>
<div>
<input formControlName="itemId" type="text" id="itemId" />
</div>
<div>
<button type="button" (click)="addItem()">
Add an Item
</button>
</div>
<div>
<button type="button">Cancel</button>
<button type="button">Save</button>
</div>
</div>
</div>
</form>
我的控件路径没有任何错误。当我检查我的东西是否在我期望的地方时:
let item of itemForm.controls.items.controls[i]
.controls;
...这似乎是正确的路径。但我仍然收到“控件未定义”的错误。这不是正确的方法吗?我的 FB 数组有 3 个表单组。
解决方案
<form [formGroup]="clientProfileForm">
<div>
<div>
<input formControlName="isAdmin" type="radio" name="admin" />
<input formControlName="isNotAdmin" type="radio" name="admin" />
</div>
</div>
<div formArrayName="contactDetails" *ngFor="
let contact of clientProfileForm.controls.contactDetails.controls; let i = index
">
<div formGroupName="{{ i }}">
<div>
<input formControlName="name" type="text" id="fullName" />
</div>
<div>
<input formControlName="phone" type="number" />
<input formControlName="phoneExt" type="number" id="phoneExt" />
</div>
<div>
<input formControlName="email" type="text" id="email" />
</div>
</div>
</div>
<div>
<div>
<input formControlName="implementationRole" type="checkbox" name="implementationRole" />
<input formControlName="operationsRole" type="checkbox" name="operationsRole" />
</div>
<div>
<input formControlName="userId" type="text" id="userId" />
</div>
<div>
<button type="button" (click)="addContact()">
Add a contact
</button>
</div>
<div>
<button type="button">Cancel</button>
<button type="button">Save</button>
</div>
</div>
</form>
如果你想在 html 中访问这个表单数组,你不应该在插值中使用函数,因为它会因为连续调用函数而降低你的应用程序性能。
let contact of clientProfileForm.controls.contactDetails.controls
您可以简单地在 html 中使用,这不会导致任何问题。
这将在 3 个表单组上循环运行并将值分配给控件。
<div *ngFor="
let contact of clientProfileForm.controls.contactDetails.controls; let i = index
">
<div formGroupName="{{ i }}">
<div>
<input formControlName="name" type="text" id="fullName" />
</div>
<div>
<input formControlName="phone" type="number" />
<input formControlName="phoneExt" type="number" id="phoneExt" />
</div>
<div>
<input formControlName="email" type="text" id="email" />
</div>
</div>
推荐阅读
- c# - 即使游戏对象被禁用,也让脚本修改变换位置
- javascript - 在提交按钮上提交表单的 onclick 操作的结果是什么?
- c# - 如何获取多个花括号内的所有值
- azure - Azure Linux Web App 默认页面没有被替换
- python-3.x - 使用 dill 或 pickle 后无法检索数据
- python - venv Ubuntu18.04中kivy1.11.1 python3.6.8黑屏
- python - 如何在单元测试中正确修补 boto3 调用
- php - 带有片段变量的 Wordpress API Yoast 默认站点标题未保存
- macos - Unity上的macOS,需要访问去小型化功能
- javascript - 我有一个平面对象数组,我想将它与对象的子数组合并