首页 > 其他分享 >angular -响应式表单深入

angular -响应式表单深入

时间:2024-10-29 11:01:03浏览次数:1  
标签:状态 单项 zorro FormArray 校验 表单 响应 angular

响应式表单为@angular/form包提供的ReactiveFormsModule,核心思想是围绕流observable,对表单进行数据设置、获取、校验等

Angular/common包里的表单

表单项有层级结构,表单项基础构造类为FormControl,当页面片段需要使用多字段聚合的表单,需要用到FormGroup或FormArray,注意FormArray不能独立使用,需要集成在FormGroup里,FormArray一般用于不确定多少表单项数组的场景,代码例子如下

 

 

FormControl校验状态包括 VALID、 INVALID、 PENDING(校验中) 、DISABLED,还有两个标志位表明表单项有没有UI操作过,pristine、touched

FormControl FormGroup FormArray都继承自 AbstractControl ,所以他们都拥有共同的属性和方法,比如上面的状态、以及validator,FormGroup FormArray也可以有自己的校验器,只不过我们很少用

 

校验最核心的方法

 

此方法只针对enable的表单项完成校验状态的更新(保存到control.status属性,并更新errors对象),并且根据emitEvent配置项决定是否emit valueChanges和statusChanges,根据onlySelf配置项决定是否对父级表单项进行校验;

界面上的校验提示是根据校验状态errors对象来显示的

 

父级表单可能是FormGroup或FormArray,根据代码可以看出如何判断表单状态,判断优先级从高到低

1、所有子项都为disable,那么此表单为DISABLED

2、errors存在,为INVALID

3、任一项为校验中,此表单为PENDING

4、任一项为INVALID,此表单为INVALID

 

 

表单项的方法:初始构造、addControl、setValue、patchValue,enable,disable,reset内部都会调用updateValueAndValidity;唯一的特例的setValidators方法,所以一般推荐修改校验器后,需要updateValueAndValidity将表单项的状态更新

 

表单多层级结构下状态的联动

 

各表单在执行自身状态校验时,需要保证表单的子项的状态都是最新,否则自身的状态校验就有问题。上面的源码也说明这一点,子control的校验先行,然后再执行本身的校验;

其次,patchValue时默认onlyself:false,会在执行完自身校验后,再向上对父级进行状态更新

 

 

例子:

表单层级结构如下

 


每个层级的表单项都有自己的validator,如果我们对B1执行patchValue时,设置了onlyself:true,那么在执行完B1.patchvalue后,A B的状态不会更新,若业务中需要使用到A B的状态,那么会有问题

 

 

zorro包里的表单

状态在上面的基础上封装了一层,success warning error validating,

界面展示校验信息对应

 

设置zorro表单状态的前提是收到statusChanges流推送,意味着若patchValue时设置emitEvent:false,则zorro表单状态不会有任何更新,但注意formControl的校验状态仍然会更新

 

 

 

zorro表单在获取状态时,会根据dirty touched标志位做判断,若表单为未操作过的状态,则不设置表单状态,这也是为什么在zorro表单提交时,会要求下面这样写的原因,这样才能让zorro每个表单项都更新到最新状态

 

 

最佳实践优化:

1、注明是zorro下的表单

2、在addControl、setValue、patchValue,enable,disable,reset方法内部都会调用updateValueAndValidity,由于updateValueAndValidity会默认往上找所有父表单项;当确认业务层面不使用父级表单状态,那么可以加上onlySelf:true,避免不必要的性能损耗

3、响应式表单不推荐和ngModel ngModelChange一块使用,响应式的核心思想在于围绕observable的使用,充分利用好valueChanges以及statusChanges

 

 

 

标签:状态,单项,zorro,FormArray,校验,表单,响应,angular
From: https://www.cnblogs.com/querybest/p/18512508

相关文章

  • angular - modal弹窗的关闭行为深入
    背景:民康项目中,弹窗里有echarts图,需要在弹窗关闭时dispose掉echarts,在nzOnCancel的方法里进行dispose操作,正常在当前页面里打开关闭弹窗是可以触发nzOnCancel的,但是url栏里输入url跳转到其他菜单,nzOnCancel不会触发,这样就存在内存泄露的风险 前置介绍简单提一下ng组件加载的......
  • angular-变更检测流程理解
    变更检测是在js事件循环过程中,将组件的数据变化反映到视图上的一种机制具体过程如下: 几点关键的:1、子组件的ngonchangengDoCheckngAfterContentChecked是在父组件更新dom(第9步)前完成2、在所有子组件的afterViewChecked钩子执行之前,父组件的ViewChild查询表就会更新,在所......
  • dedeCMS 自定义表单地区联动类型不可用
    问题:自定义表单地区联动类型不可用。解决办法:打开 /dede/templets/diy_field_edit.htm 文件,找到:<optionvalue="stepselect">联动类型</option-->修改为:<!--><optionvalue="stepselect">联动类型</option>打开 /dede/templets/diy_field_......
  • Angular 19 "要" 来了⚡
    前言Angular19预计会在11月中旬发布,目前(2024-10-27)最新版本是v19.0.0-next.11。这次v19的改动可不小哦,新增了很多功能,甚至连effect都breakingchanges了呢......
  • Bootstrap使用指南:快速构建响应式网页的利器
    引言在前端开发的领域,Bootstrap是一个备受欢迎的CSS框架,它通过预先定义的样式和组件布局,极大地提高了开发效率并降低了从零开始的复杂度。如果你希望在短时间内构建美观、响应式的网站,Bootstrap无疑是你的好帮手。然而,新手在学习和使用Bootstrap时常常会遇到一些问题。今天,我......
  • Selenium测试form表单之下拉列表
    处理form表单中的下拉列表,需要用到一个Selenium工具类-Select一、Select工具类常用属性和方法方法/属性描述1select_by_value()根据值选择2select_by_index()根据索引选择3select_by_visible_text()根据文本选择4deselect_by_value根据值反选5de......
  • 推荐一个动态表单查询条件构造组件(yl-dc-component)
    什么是yl-dc-component一个基于antdv组件库的动态查询json生成组件,用于构建复杂的条件查询,让查询更加简单灵活。支持条件分组,保存历史条件等功能。后端可基于构造的json进行数据库查询操作。使用安装npmiyl-dc-component或yarnaddyl-dc-component案例<script......
  • 抖音发送私信接口响应的二进制数据解析
    请求发送评论接口得到:data=b'ap`\x00\x97\xce\xaa(\xef\xaa\xcd\x98[\xe1\x07\xcex\xd3%\xa4\x06z\x07$N\x12c\xde\x9b\xf0\xb2\xff\xb6&\xcb\xce\xfc\xd5~\xbf\xd0=\x94\x1e\xda\x9e|\xc7\xfcED\xf4\xeePI.\xc94\x99G\xb1D\xc8d......
  • SpringMVC实战(2):接收与响应数据
    二、SpringMVC接收数据2.1访问路径设置@RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系。SpringMVC接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求。精准路径匹配在@RequestMapping注解指定URL地......
  • 考虑电池储能寿命损耗和电价型需求响应的微电网经济调度(Matlab代码实现)
      ......