博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Angular 响应式表单之表单分组
阅读量:6808 次
发布时间:2019-06-26

本文共 2791 字,大约阅读时间需要 9 分钟。

1、案例需求

表单提交,表单全部校验成功才能提交,当表单校验错误,表单边框变红,同时有错误提示信息,有重置功能

2、名词解释

在分析代码之前,首先明确 FormControl、formControl、formControlName、FormGroup、formGroup、formGroupName、FormArray、formArray、formArrayName 都是什么意思以及它们的用法。

2.1、FormControl

  • FormControl:跟踪独立表单控件的值和验证状态。它和 FormGroup 和 FormArray 是 Angular 表单的三大基本构造块之一。它扩展了 AbstractControl 类,并实现了关于访问值、验证状态、用户交互和事件的大部分基本功能。

当使用响应式表单时,FormControl 类是最基本的构造块。要注册单个的表单控件,在组件中导入 FormControl 类,并创建一个 FormControl 的新实例,把它保存在类的某个属性中。

export class AppComponent implements OnInit {    const control = new FormControl('', Validators.required);    console.log(control.value);      // ''    console.log(control.status);     // 'INVALID'}

在组件类中创建了控件之后,还要把它和模板中的一个表单控件关联起来,为表单控件添加 formControl 绑定。

  • formControl:是一个输入指令,接受 FormControl 的实例,在模版中使用。
  • formControlName: 也是输入指令,但是它接受的是一个字符串,同 formGroup 指令配合使用。
//等同于

2.2、FormGroup

  • FormGroup:跟踪一组 FormControl 实例的值和有效性状态

FormGroup 把每个子 FormControl 的值聚合进一个对象,它的 key 是每个控件的名字。它通过归集其子控件的状态值来计算出自己的状态。如果组中的任何一个控件是无效的,那么整个组就是无效的。

2.3、FormArray

  • FormArray:跟踪一个控件数组的值和有效性状态

FormArray 聚合了数组中每个表单控件的值。它会根据其所有子控件的状态总结出自己的状态。如果 FromArray 中的任何一个控件是无效的,那么整个数组也会变成无效的。

  • FormControl、FormGroup、FormArray 类 用法一致
  • formControl、formGroup、formArray 输入指令 值为对应类的实例 用法一致
  • formControlName、formGroupName、formArrayName 输入指令 值为字符串 用法一直

3、代码分析

fromGroup 可以然我们对表单内容进行分组,方便我们在语义上区分不同类型的输入,本例中,地址细分为“省”、“市”、“区”。

this.formGroup = this.fb.group({      name: ['', nameValidator()],      age: ['', ageValidator()],      sex: ['', sexValidator()],      address: this.fb.group({        province: ['', requiredValidator('请输入省')],        city: ['', requiredValidator('请输入市')],        district: ['', requiredValidator('请输入区')]      })    });

address 此时不是 fromControl 而是 formGroup。

{

{errorMessage('province')}}

{

{errorMessage('city')}}

{

{errorMessage('district')}}

在获取 省市区的 formControl 时,可以通过这样获取

// 太复杂了this.formGroup.controls['address'].controls['province'];// 同样复杂this.formGroup.get('address').controls['province'];// 还好this.formGroup.get(['address', 'province']);

第三种方式虽然简单,但是不够完美,get方法不能一步到位,必须同时传入 formGroupName 和 formControlName。因此在查看单个表单是否有错误信息时,必须先判断 formControlName 是子组件还是孙子组件。

errorMessage(formControlName: string): string {    let control: AbstractControl;    if (this.formGroup.contains(formControlName)) {      control = this.formGroup.get(formControlName);    } else {      control = this.formGroup.get(['address', formControlName]);    }    return ((control.touched || control.dirty) && control.invalid) ? control.errors.message : '';  }

contains方法:检查组内是否有一个具有指定名字的已启用的控件,存在返回 true,不存在返回 false。

转载地址:http://ngtwl.baihongyu.com/

你可能感兴趣的文章
是德科技成功开发广泛的测试与测量产品
查看>>
深圳465亿建11代生产线,TCL三星带头认购股权
查看>>
Solaris 上网配置
查看>>
谭晓生:如何面对IoT时代的安全新挑战?
查看>>
AV-TEST最新Windows 10平台最佳杀毒软件测试结果
查看>>
秋色园QBlog技术原理解析:性能优化篇:读写分离与文本数据库(十八)
查看>>
苹果iCloud大调整:干掉1TB版本,2TB降价
查看>>
大数据要如何提高 才能满足智慧城市需求?
查看>>
银江股份:全面布局持续并购打造智慧城市生态圈
查看>>
中拉光伏产业合作蓬勃发展前景远大
查看>>
定位到文件目录并选定文件
查看>>
瑞典驻华参赞:智慧城市建设提升为国家战略
查看>>
跨界合作成潮流 智能家居竞争升级
查看>>
祖传CMOS走出家门,佳能将在传感器供应圈中决战索尼
查看>>
多厂商云成本管理窍门
查看>>
思科:企业数据中心技术产品采购放缓
查看>>
谈家装安防防盗设备的重要性
查看>>
StatX 获250万美元融资,随时随地通知公司业务变化
查看>>
iOS开发系列-ARC浅解
查看>>
广东电网公司大数据平台初步建成
查看>>