Angular4的表单
来源:互联网 发布:sql注入式攻击 编辑:程序博客网 时间:2024/06/05 03:39
Angular4的表单分为两种,一个是模板式表单,另一种是响应式表单。
首先先讲一下数据模型:数据模型不是任意一种对象,是一种用于存储表单数据的数据结构。
模板式表单
该表单的数据模型是由组件模板上相关的指令定义(隐式创建)的,因为使用了这种方式定义表单的数据模型会受限于html语法,所以只适合用于一些简单的场景。
模板式表单有三个api:ngForm、ngModel、ngModelGroup(这三个api在模板上都可以使用模板本地变量进行实例化,因此可以将该模板本地变量传进控制器)
==>(先讲一下,ngForm、ngModel这两个指令在模板上是直接添加在标签上即可)
首先讲一下ngForm:
ngForm是代表了整个form表单,在创建form表单的时候,angular会自动添加到form标签上(等同于<form ngForm></form>
)
其工作原理是:创建了ngForm后,angular会隐式创建一个FormGroup类的实例,然后ngForm会寻找其子元素中标有ngModel的标签的值,并添加在FormGroup中。然后页面上即可通过ngForm这个对象访问到表单数据。因为ngForm可以使用模板本地变量引用,故可以使用(ngSubmit)=“xxx(#ngForm)”事件进行传递到控制器。
当然,不一定要在form表单使用ngForm,可以在div等标签内使用,此时需要手动添加指令。
如果不想被Angular接收表单,可以添加ngNoForm指令即可。
ngModel
该指令表示了表单内的一个控件。刚刚说到的ngForm会寻找表单内有ngModel的标签,就是说这个标签。
该标签的工作原理是:添加了该指令后,angular会隐式创建一个FormControl类,用于存储其值。
这个指令是直接添加到标签上
<input ngModel name="text">
但是还要添加name属性(因为这个ngModel标志的控件的值会被添加到FormGroup中,而FormGroup的参数是个对象,对象必须要有key)。
当然这个指令也可以使用模板本地变量,同样也可以通过该变量获得其值
<input #text="ngModel" name="text">
ngModelGroup
该指令表示的是表单的一部分,即多个ngModel的集合。用于区分开来某些特别的ngModel控件。
其工作原理与ngForm类似,也是隐式创建一个FormGroup类用于存储其包括的控件的值。其在ngForm中的表现为嵌套。
不过他的用法是需要赋值一个名称(用于存储在ngForm中)
响应式表单
使用响应式表单时,通过编写typescript而不是html代码创建一个底层数据模型,在这数据模型定义之后,使用一些特定指令将模板的html代码与数据模型进行连接起来。
所以使用响应式表单分为两步:
(1)编码创建一个底层数据模型;
(2)使用特定的指令将模板的html代码与数据模型进行连接起来。
首先讲一下创建底层数据模型
Angular/forms提供三个类进行创建底层数据模型:FormControl、FormGroup、FormArray
FormControl
这个类是响应式表单的基本单位,也就是每个表单控件都要定义一个该类。
userName:FormControl=new FormControl("aaa")
其内的参数表示该控件的初始值
FormGroup
myForm:FormGroup=new FormGroup({})
该类可以用于表示整个表单、也可以用于表示部分表单
该类的参数内是一个对象,期内保存了该类包括的控件(FormControl)的值(是一组key:value对)
FormArray
partForm:FormArray=new FormArray([])
该类和FormGroup类似,也是一些控件的集合,但是和其区别是,FormArray是表示的是可增长的字段集合,而FormGroup是固定字段集合。
(使用场景:在表单中可能有多个email要添加,此时就可以使用该类进行包括)
其参数值是个数组,所以一般会与*ngFor一起用
再讲一下连接的表单指令
表单指令有两种:属性绑定指令、属性名定义指令
FormGroup—>formGroup—>formGroupName
FormControl—>formControl—>formControlName
FormArray—>null—>formArrayName
(记得一点,对于属性名指令是一定要早formGroup范围内使用)
这些指令都是在模板中使用。
首先先创建一个FormGroup类的数据模型,该数据模型会代表了整个表单。因此在模板中form标签内添加一个属性绑定,即
<form [formGroup]="myForm">
而该FormGroup类实例的参数–>{},内就是存放该表单内的所有控件的值(也就是FormControl和FormArray的控件)。
然后在定义了formGroup属性的表单内,每个控件都要定义其名字,使用的指令就是FormGroupName、FormControlName、FormArrayName这三种指令。
<form [formGroup]="formModel" (submit)="onSubmit()"> <div formGroupName="dateRange"> 起始日期:<input type="date" formControlName="from"> 截止日期:<input type="date" formControlName="to"> </div> <div> <ul formArrayName="emails"> <li *ngFor="let e of this.formModel.get('emails').controls; let i =index;"> <input type="text" [formControlName]="i" /> </li> </ul> <button type="button" (click)="addEmail()">增加邮箱</button> </div> <div> <button type="submit">提交</button> </div></form>
讲一下对于取得FormGroup实例对象内的参数对象内的控件名称对应的值的方法:this.formModel.get(‘emails’);用get()方法。
这次就写到这呗,下次再补充————
- Angular4的表单
- angular4中关于表单的校验
- angular4表单-响应式表单
- Angular4学习笔记之表单
- angular4.0的模板式表单、响应式表单及其错误提示
- angular4表单—模板式表单
- Angular4模板式表单、响应式表单、表单状态字段
- 一个angular4.0响应式表单应用~~~
- angular4响应式表单与校验
- Angular4的输入属性
- angular4的rollup
- 对angular4的认识
- angular4的对象
- angular4的初认识
- Angular4
- Angular4
- Angular4 中常用的指令
- Angular4 树组件的使用
- 单链表建立
- stm32 memcpy 错位问题
- Fragment写主页
- Linux标准目录结构
- Uncaught TypeError: s.elem.on is not a function
- Angular4的表单
- 网页调用本地windows应用例子
- Mysql视图相关操作
- bootstrap-validator使用笔记
- java线程池种类和使用场景
- mina之基本使用
- JPEG图像解压缩操作
- java JXL POI EXCEL 列坐标 和 从0开始的数字下标 的相互转换
- centOS7.2 安装配置tomcat8