Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套

Angular 响应式表单 FormArray 与 FormGroup 相互嵌套

在类文件中(组件的TS文件):

声明一个Form表单:

javascript 复制代码
 public validateForm: FormGroup;

在构造方法中:

javascript 复制代码
  private fb: FormBuild;

声明一个FormBuild的对象

在构造方法中:

javascript 复制代码
constructor(private fb: FormBuilder) {
     this.validateForm = this.fb.group({
        name: [null],
        sex : [null],
        age : [null],
        address: this.fb.array([
            new FormGroup({
                street : new FormControl(null),
                country: new FormControl(null),
            }),
        ]),
    });
  }

这样在组件中就构造出来了一个嵌套了FormArray的FormGroup,

这个时候,需要将validateForm这个表单中address的属性实例成一个FormArray

使用Angular中的get 方法

javascript 复制代码
 get addressFormArray(){
        return this.validateForm.controls['address'] as FormArray;
    }

这个时候,在组件中就会生成一个变量:addressFormArray;

当想对表单中的address中的控件进行操作,可以直接对变量:addressFormArray进行操作;

1.对validateForm中的address增加一对新的 street 和 country 有两种方法:

a.使用变量addressFormArray,具体如下:

javascript 复制代码
  this.addressFormArray.push(
            new FormGroup({
                street : new FormControl(null),
                country: new FormControl(null),
            }),
        )

b.直接对validateForm进行操作

javascript 复制代码
 (this.validateForm.controls['address'] as FormArray).push(
            new FormGroup({
                street : new FormControl(null),
                country: new FormControl(null),
            })
        )

对validateForm的增加,可以放在一个事件的方法里

2.去掉validateForm中的address对某一对属性的控制,

正常情况下,是可以知道在当前删除的是 street 和 country在address这个数组中的下标,从而可以快速准确的删除,同样,删除也是可以有两种方式:

a.使用变量addressFormArray,具体如下:

javascript 复制代码
  this.addressFormArray.removAt(需要删除元素的下标)

b.直接对validateForm进行操作,具体如下:

javascript 复制代码
 (this.validateForm.controls['address'] as FormArray).removeAt(需要删除的数组的下标)

3.在模版文件中如何显示

javascript 复制代码
<form [FormGroup]="validateForm">
        <div> 
            ... 
            <!-- 关于直接在FormGroup的部分省略 -->
        </div>
    <div FormArrayName="adderss">
        <div *ngFor="let address of validateForm.controls['address'].controls;let i = index">
            <div [formGroupName]="i">
                <div>
                    在这里就可以自己定义address 中FormGroup的内容了,增加关于FormGroup的控件。
                </div>
            </div>
            
        </div>
    </div>
相关推荐
程序员海军6 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee7 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
excel8 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰8 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境9 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉10 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
风骏时光牛马10 小时前
从零到实战:AI全栈学习进阶路线
前端
FRing0311 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
用户3600555790011 小时前
Kestrel_VLLM - 15 · decode 优化四连击:19ms → 8ms
前端
IT_陈寒11 小时前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端