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()方法。

这次就写到这呗,下次再补充————