Angular 2 动态嵌套表单 [英] Angular 2 Dynamic Nested Form
问题描述
基本上我想创建一个带有嵌套对象的动态表单,如下图:
- 收益在模型的数组中
- 我们应该能够根据需要添加/删除回报.
- 表单应同步底层表单控件和模型
- 支付的数量是任意的,应该从模型加载到表单中
我找不到如何在 Angular 2 中执行此操作的工作示例,尽管这在 Angular 1 中很容易做到.
<小时>下面是我最初的问题,我已经更新了它以进行澄清(见上文):
首先我只想指出,我知道几天前刚刚发布了新版本的 Angular 2 rc.2.因此,用于创建动态嵌套表单的代码可能已经更改了一些,但没有足够的文档来解决这个问题.
在 Angular 2 的最新版本中(我目前使用的是 rc.1,但计划更新到 rc.2)我需要创建一个这样的表单(视图的伪代码):
<a class="button" (click)="addExpenseControl()">添加</a><a class="button" (click)="deleteExpenseControl()">Delete</a></表单>
所以上面的伪代码不起作用,但老实说,由于缺乏文档,我无法弄清楚如何连接这样的东西.有一些关于嵌套 ControlGroup 的教程,但这不适合这里的情况,因为我们需要能够动态添加和删除控制组,而且我还需要能够将它们与模型同步.
我发现这个 plunkr 这里由 Angular 团队提供,它允许将控件添加到表单中——但这不是添加/删除 ControlGroup,而是使用 ControlArray,我不确定这是否适用于此处?
我非常熟悉使用较新的基于模型的 Angular 2 表单,但是我正在抓紧资源以正确嵌套它们(动态!),并将此嵌套数据绑定到主表单模型中.我将如何引用视图中的嵌套控件?上面的伪代码甚至接近吗?我会从我的控制器发布代码,但老实说,当涉及到上面的嵌套费用 (ControlGroup ??) 时,我不知道从哪里开始......
我不得不自己解决这个问题,因为 Angular 2 中的表单似乎仍在变化,而且我还没有看到任何其他类似的例子(尽管这似乎是一个非常常见的用例).
这是使用 Angular2 RC3 的工作示例的 plunkr.
我正在使用 本文档中更新的 Angular 2 表单代码.
app.component.ts(包含表单):
import { Component } from '@angular/core';从@angular/forms"导入{REACTIVE_FORM_DIRECTIVES、FormControl、FormGroup、FormArray};@成分({选择器:'我的应用',templateUrl: 'app/app.html',指令:[REACTIVE_FORM_DIRECTIVES],提供者:[]})导出类 AppComponent {表格:表格组;我的模型:任何;构造函数(){//初始化表单的模型以保持同步.//通常你会从后端 API 获取它this.myModel = {姓名:乔安娜·杰德泽西克",回报:[{金额:111.11,日期:2016 年 1 月 1 日",最终:假},{金额:222.22,日期:2016 年 1 月 2 日",最终:真实}]}//用空的 FormArray 初始化表单以获取收益this.form = new FormGroup({名称:new FormControl(''),回报:新的 FormArray([])});//现在我们手动使用模型并为每个 PayOff 将 FormGroup 推送到表单的 FormArraythis.myModel.payOffs.forEach((po) =>this.form.controls.payOffs.push(this.createPayOffFormGroup(po)));}createPayOffFormGroup(payOffObj) {console.log("payOffObj", payOffObj);返回新的表单组({金额:新的 FormControl(payOffObj.amount),日期:新的FormControl(payOffObj.date),最终:新的FormControl(payOffObj.final)});}addPayOff(事件){event.preventDefault();//确保此按钮不会尝试提交表单var emptyPayOff = {amount: null, date: null, final: false};//为模型和表单控件添加回报,因为我认为 Angular 还没有任何方法可以自动执行此操作this.myModel.payOffs.push(emptyPayOff);this.form.controls.payOffs.push(this.createPayOffFormGroup(emptyPayOff));console.log("添加新的支付", this.form.controls.payOffs)}deletePayOff(索引:编号){//从模型和 FormArray 中删除收益this.myModel.payOffs.splice(index, 1);this.form.controls.payOffs.removeAt(index);}}
注意上面,我手动将新的 FormGroup 对象推送到 form.controls.payOffs 数组中,该数组是一个 FormArray 对象.
app.html(包含表单 html):