7.1表单处理
现在web应用表单应该满足的用户需求:
自定义校验规则
友好的提示信息
彼此依赖的字段应该一起校验
可以控制提交值
可以提交方式(http方式,ajax异步请求,websocket消息)
纯HTML表单
纯HTML表单支持:
显示表单项
检验用户输入
提交表单数据
实战:定义一个注册表单,post方式提交到“/register”,表单字段要求如下:
账号:不能为空,只能是大小写字母
电话:11位数字
注册:提交按钮
angular表单
angular表单相关概念
angular具有两种表单:模板式表单和响应式表单
模板式表单:通过模板相关指令定义,应用于简单场景。
响应式表单:先通过TypeScript代码定义底层数据模型,再使用特定指令将HTML元素和这个底层模型连接起来。应用于复杂场景。
angular表单由数据模型来存储表单的数据。
在模板式表单中,数据模型由angular基于组件模板的指令隐式创建
在响应式表单中,数据模型由编码创建
数据模型由angular/forms模块中的一些特定的类组成,如FormControl、FormGroup、FormArray等组成。在模板式表单中不能直接访问到这些类
响应式表单不会替你生成HTML,模板需要自己编写。
使用模板式表单需要引入HttpModule;使用响应式表单需要引入ReactiveFormsModule
模板式表单
ngForm
代表整个form表单。
ngForm会创建FromGroup实例
ngForm可以使用在div上
ngForm会拦截html表单的提交事件,阻止表单的自动提交并用ngSubmit事件来提交事件
angular会自动的在form标签上挂一个ngForm指令。如果想禁用ngForm接管表单,需要在form标签中指定ngNoForm属性
ngForm将接管form表单的行为导致原表单的提交行为失效
ngForm会自动扫描所有带有ngModel属性的字段
ngModel
标记html元素为表单元素的一部分。一个ngModel代表一个表单字段,
ngModel会隐式创建一个FromControl实例来代表字段数据模型并存储字段值
在ngForm下使用ngModel不需要使用中括号“[ ]”或小括号“( )”,不过需要为所在标签指定name属性。这个name属性指定了标签值的key
ngModelGroup
表单的一部分,可以使表单划分出层级关系。
ngModelGroup会创建FormGroup实例
ngModelGroup="passwordGroup"指定组名
使用模板本地变量绑定ngForm、ngModel、ngModelGroup后,使用模板本地变量.value可以获取到表单的值
实战
创建一个注册模板式表单,打印出表单的输入值,当点击提交按钮使,在控制台打印出表单的值
模板代码
```html
账号:电话:邮箱:密码:确认密码
表单值:{{regForm.value | json}}
账号:{{userName.value | json}}
电话:{{telphone.value | json}}
邮箱:{{email.value | json}}
密码:{{password.value | json}}
确认密码:{{password1.value | json}}
密码组:{{passwordGroup.value| json}}
响应式表单
编码创建数据模型
FormControl
构成表单的基本单元。
通常用来表示一个input元素,也可以表示更复杂的元素,如日历,下拉选择框
保存者元素当前的值、校验状态和元素是否修改过等。
FormControl的构造函数参数为指定初始值
FormGroup
FormControl的集合
FormArray
FormControl的集合
响应式表单需要用到的指令
响应式表单使用与模板式表单完全不同的指令。这些指令全部来自于ReactiveFormsModule模块中。
类名
指令(使用属性绑定)
指令(使用属性名)
FormGroup
formGroup
formGroupName
FormControl
fromControl
formControlName
FormArray
无法使用属性绑定
formArrayName
响应式表单的指令不可被引用,不能被模板本地变量引用。做到了控制器和模板的隔离
使用响应式表单时,我们需要考虑的只有formGroup和3Name
类型为formGroup的变量是控制器的属性,故用属性绑定语法。
3Name为formGroup下的字符串,不使用属性绑定
formGroup
使用一个绑定form标签的fromGroup代表整个表单
formGroupName 绑定formGroup下的formGroup formGroupName="dateRange"
formControlName="from" 绑定formGroup下的formControl 必须用在formGroup的范围之内
formArray 绑定formGroup下的formArray *ngFor="let e of this.formModel.get('emails').controls; let i=index;" formControlName="i"
addEmail(){ let emails=this.formModel.get('emails') as FormArray; emails.push(new FormArray()); }
formControl不能用在formGroup的内部 [fromControl]=""
formbuilder
formBuilder简化了响应式表单中模型定义语法
注入fb:FormBuilder
“ fb.array ” 代替 “new FormGroup”
“ fb.array ” 代替 “new FormArray”
“ fb.control ” 代替 “new FormControler”
“ [' '] ”替代formGroup下的“new FormControler”
fb.array可以传入额外的参数检验formGroup
[' ']参数:['初始值',检验方式,'异步校验方法]
Last updated
Was this helpful?