Angular 表单

  angular提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。二者都从视图中捕获用户输入事件、验证用户输入、创建表单模型、修改数据模型,并提供跟踪这些更改的途径。

  响应式表单和模板驱动表单在处理和管理表单和表单数据方面有所不同,各有优势。

  •   响应式表单更健壮:可扩展性、可复用性和可测试性更强。(如果表单时应用中的关键部分,或者要使用响应式编程模式来构建应用,可以使用响应式表单。)
  •   模板驱动表单在往应用中添加简单的表单时非常有用(比如:邮件列表的登记表单),它们很容易添加到应用中,但是不想响应式表单一样容易扩展。(如果表单需求比较简单,或者逻辑比较清晰,可以使用模板驱动表单)

响应式表单和模板驱动表单的关键差异

  响应式 模板驱动
建立(表单模式) 显示,在组件类中创建 隐私,由组件创建
数据模式 结构化 非结构化
可预测性 同步 异步
表单验证 函数 指令
可变性 不可变 可变
可伸缩性 访问底层api 在api之上抽象

响应式表单和模板驱动表单的共同基础

二者共享了一些底层构造块:

  • FormControl 实例 用于追踪单个表单控件的值和验证状态。
  • FormGroup 用于追踪一个表单控件组的值和状态。
  • FormArray 用于追踪表单控件数组的值和状态。
  • ControlValueAccessor 用于在Angular的FormControl实例和原生DOM元素之间创建一个桥梁。

建立表单模型

响应式表单和模板驱动表单都是用表单模型来跟踪Angular表单和表单输入元素之前值的变化。

在响应式表单中建立:

下面是一个带有输入字段的组件,它使用响应式表单实现了单个控件。

import { Component } from '@angular/core';
import { FormControl } from '@angular/forms'; @Component({
selector: 'app-reactive-favorite-color',
template: `
Favorite Color: <input type="text" [formControl]="favoriteColorControl">
`
})
export class FavoriteColorComponent {
favoriteColorControl = new FormControl('');
}

权威数据源负责提供在指定时间点上表单元素的值和状态。在响应式表单中,表单模式充当权威数据源。上面代码中的表单模型就是FormControl的实例。

reactive forms:响应式表单

form control instance:窗体控件实例

direct access to FormControl instance after link is created by FormControlDirective:在由FormControlDirective创建链接后直接访问FormControl实例

在响应式表单中,表单模型是显式定义在组件类中的。然后,响应式表单指令(这里是FormControlDirective)会把这个现有的表单实例通过数据访问器(ControlValueAccessories的实例)来指派给视图中的表单元素。

在模板驱动表单中建立:

下面是一个带有输入字段的组件,使用模板驱动表单实现了单个控件。

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

@Component({
selector: 'app-template-favorite-color',
template: `
Favorite Color: <input type="text" [(ngModel)]="favoriteColor">
`
})
export class FavoriteColorComponent {
favoriteColor = '';
}

在模板驱动表单中,权威数据源是模板。

Can only access FormControl instance via NgModal directive:只能通过NgModal指令访问FormControl实例

表单模型中的抽象促进了结构的简化。模板驱动表单的NgModal指令负责创建和管理指定表单元素上的表单控件实例,它不那么明显,但是不必直接操纵表单模型。

表单中的数据流

在处理表单输入时,两种表单遵循两种不同的策略。

响应式表单中的数据流:待续

模板驱动表单中的数据流:待续

表单验证

验证是任何表单必备的部分,Angular提供了一组内置的验证器,并提供了创建自定义验证器的功能。

  • 响应式表单把自定义验证器定义成函数,以要验证的控件作为参数。
  • 模板驱动表单和模板指令紧密相关,并且必须提供包装了验证函数的自定义验证器指令(什么意思?没明白)

测试

可变性

可伸缩性

最新文章

  1. [LeetCode] Repeated Substring Pattern 重复子字符串模式
  2. 百度编辑器 ueditor 内容编辑自动套P标签,及p标签 替换
  3. category - junit用例分组执行
  4. css 变量与javascript结合
  5. 使用Qt installer framework制作安装包
  6. [array] leetCode-4-Median of Two Sorted Arrays-Hard
  7. 安装使用eclipse
  8. vi命令复制粘贴
  9. C#中DataTable与XML格式的相互转换
  10. work-7.2
  11. Linux下的常用文本编辑器
  12. angualrjs添加ngTouch
  13. Mysql Group by 使用解析
  14. 【原创】Linux基础之命令行浏览器links
  15. Spring和SpringBoot比较,解惑区别
  16. ArcGIS 10.2 链接64位Oracle数据库
  17. KVM VCPU线程调度问题的讨论
  18. 无头结点的单链表(C语言)
  19. java多线程3种方式
  20. python之multiprocessing创建进程

热门文章

  1. php导出合同模板到excel
  2. 0104 gradle入门
  3. Unity Reflection Probe使用入门
  4. Git 的 4 个阶段的撤销更改
  5. Golang的运算符-赋值运算符
  6. golang调用CertUtil获取文件md5
  7. Asp.net MVC中ReturnUrl的使用
  8. 根据上传的MultipartFile通过springboot转化为File类型并调用通过File文件流的方法上传特定服务器
  9. Nachos-Lab3-同步与互斥机制模块实现
  10. C++实现单链表的12种基本操作