1. 说明

表单是Web程序中的重要组成部分,构建良好以及实用的表单必须解决如下几个问题:

(1). 如何跟踪及更新表单的数据状态

(2). 如何进行表单验证

(3). 如何显示表单验证信息

Angular2针对如何解决复杂的表单问题,提供了Template Driven和Model Driven两种模式。

2. Template Driven

Angular2 提供了NgModel指令来提供双向绑定,通过双向绑定来同步跟踪表单的数据变化,十分简单与易用。通过NgModel指令创建的表单必须结合DOM模板才能使用,所以称之为Template Driven方式。我们来看一个采用NgModel创建表单的示例:

import { Component, OnInit } from '@angular/core';

@Component({

moduleId: 'portal',

selector: 'portal',

template: `<form #f="ngForm" class="form" role="form">

<legend>Form title</legend>

<div class="form-group">

<label for="">name:</label>

<input type="text" class="form-control" name="name" id="name" [(ngModel)]="name" required>

</div>

<button type="submit" class="btn btn-primary" [disabled]="!f.valid">Submit</button>

</form>`

})

export class PortalComponent implements OnInit {

name: string;

constructor() { }

ngOnInit() { }

}

我们实现了一个简单的输入表单,使用ngFrom创建一个表单,包含一个名称为name的必录框和一个提交按钮。模型类中几乎木有什么内容。Template Driven中的校验是通过在模板中针对各个模块添加校验性指令实现的,例如给name输入框添加必录性校验required。

3. Model Driven

接下来我们来创建一个Model Driven的示例,如下

import { Component, OnInit } from '@angular/core';

import { FormGroup, FormBuilder, FormControlName, Validators } from '@angular/forms';

@Component({

moduleId: 'portal',

selector: 'portal',

template: `<form [formGroup]="f" class="form" role="form">

<legend>Form title</legend>

<div class="form-group">

<label for="">name:</label>

<input type="text" class="form-control" name="name" id="name" formControlName="name">

</div>

<button type="submit" class="btn btn-primary" [disabled]="!f.valid">Submit</button>

</form>`

})

export class PortalComponent implements OnInit {

f: FormGroup;

constructor(private fb: FormBuilder) {

}

ngOnInit() {

this.f = this.fb.group({

'name': ['', [Validators.required]]

})

}

}

虽然表面上看上去差不多,但是Model Driven和Template Driven还是存在部分区别。首先,不同于采用ngFrom指令来创建表单,Model Driven采用formGroup来创建表单,同事录入框的指令也不同于ngModel,而是使用formControlName。组件类也存在较大区别,Model Driven创建的表单实际的控制逻辑是在组件类中实现的,我们看到FormGroup是通过FormBuilder创建出来的来的,并且针对FormGroup的每个组件可以通过Validators类型进行编码来实现校验。例如,给name组件加上必录性校验required。

4. 表单验证

Angular2跟踪输入框的三种状态信息,并应用相应的css样式,分别如下:

(1). touched or untouched 是否访问过

(2). valid or invalid 是否有效

(3). pristine or dirty 是否变化过

同样的,Angular2跟踪整个表单的状态,可以使用来禁止及启用提交表单。

我们来了解一下表单验证是如何工作的。

Template Driven模式中,首先,Angular会自动的给form表单应用一个ngForm指令,该指令会在内部创建一个FromGroup。 其次,每个ngModel指令会在内部创建一个匿名的FormControl,并将注册到FromGroup中,而校验类指令例如required等则会和FormControl绑定。当改变输入时,则会触发FormControl中对应的OnChange事件触发校验等。

在Model Driven模式中,在对应的组件类中编码创建FromGroup,每个子类型为FromControl对象,在创建FromControl子类型中可以使用Validators绑定对应的校验方法,最后采用属性的方式和表单进行绑定。在模板中,利用formControlName指令将FromControl元素和对应的输入框链接起来,当改变输入时,则会触发FormControl中对应的OnChange事件触发校验等。

我们知道了校验是如何工作的以及校验的对应的状态信息,我们可以根据这些信息进行相应状态判断与显示。例如,通过控制表单的valid的状态来禁用提交按钮等。

5. 联合使用

Template-Driven方式在展现数据以及实现表单初始化上非常方便与直观,而Model-Driven方式在添加校验,监控数据改变以及自动化测试方便具有突出的有点。在某些情况下,我们可以联合使用这两种方式,例如

(1). 我们可以使用ngModel去读取数据,使用fromGroup添加校验信息并监控数据变化

(2). 我们可以添加一个引用来指向单个输入框的control信息,并利用该应用来实现单个组件状态信息的显示

最新文章

  1. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
  2. 在Python中使用可变长参数列表
  3. HBase自动分区
  4. Android四大组件之Service
  5. docker的例子
  6. Java应用架构的演化之路
  7. Java [Leetcode 217]Contains Duplicate
  8. AndroidAndroid程序提示和消息button响应事件
  9. HostingEnvironment RegisterObject和QueueBackgroundWorkItem
  10. ssh 依赖关系
  11. ubuntu14.04使用rails连接mysql数据库
  12. Vue.js05:vue内联样式
  13. JS 转换HTML转义符
  14. 基于SSL实现Mysql加密主从
  15. 2019-04-28——Django学习
  16. java 数组声明定义 数组内存分配 数组初始化 数组引用 数组的遍历
  17. DELL升级bios方式
  18. fortran学习网站
  19. Effective Java通用设计
  20. importlib的用法

热门文章

  1. 用vue.js学习es6(一):基本工具及配置
  2. ceph hadoop spark 大数据处理
  3. SSM整合(三):Spring4与Mybatis3与SpringMVC整合
  4. python实战(开发新浪微博应用)
  5. Android疑难杂症收集
  6. Leetcode 18. 4Sum
  7. 浅谈:javascript的面向对象编程之基础知识的介绍
  8. 火车头采集ecshop 文章接口文件
  9. Smarty模版引擎的原理
  10. 如何访问wikipedia 的中文版