angular中两种表单的区别(响应式和模板驱动表单)


Posted in Javascript onDecember 06, 2018

angular的表单

angular的表单分为两种,一种是响应式的表单,另一种是模板驱动表单。使用'@angular/forms'库中的FormGroup, FormControl,FormArray,FormBuilder 等类构建出的数据对象就是响应式的表单,在响应式的表单中,我们会在数据源里面进行各种操作,像添加校验等,在html文件中使用 formGroup,formGroupName,formControlName等将数据和视图进行绑定(需要引入ReactiveFormsModule)。

//ts
    profileForm = new FormGroup({
      firstName: new FormControl(''),
      lastName: new FormControl(''),
      address: new FormGroup({
       street: new FormControl(""),
       city: new FormControl(""),
       state: new FormControl(""),
       zip: new FormControl("")
      })
     })
    //html
    <input type="text" formControlName="firstName">

模板驱动的表单是我们实例化好一个类的数据之后,在html中使用 NgForm 指令后将数据和表单进行绑定,使用[(ngModel)]来将表单的数据和和视图进行双向绑定,NgForm 指令为 form 增补了一些额外特性。 它会控制那些带有 ngModel 指令和 name 属性的元素,监听他们的属性。

//html
<form #heroForm="ngForm" appIdentityRevealed (ngSubmit)="onSubmit()">
  <div >
   <label for="name">Name</label>
   <input type="text" id="name" required [(ngModel)]="model.name" [ngModelOptions]="{updateOn: 'blur'}" name="name">

  <div >
   <label for="power">Hero Power</label>
   <select id="power" class="form-control" required [(ngModel)]="model.power" name="power">
    <option *ngFor="let power of powers" [value]="power">{{power}}</option>
   </select>
  </div>

  <button type="button" (click)="newHero();heroForm.reset()">
   New Hero
  </button>
  <button type="submit" [disabled]="!heroForm.form.valid">
   Submit
  </button>
 </form>
//ts
model = new Hero(18, 'Dr IQ', this.powers[0], 'Chuck Overstreet');

响应式表单

响应式的表单中,添加校验逻辑是以返回一个ValidatorFn类的函数实现的

function forbiddenNameValidator(value: string): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } | null => {
    const rule = new RegExp(value,'i');//设定验证规则,i是忽略大小写的意思
    const result = rule.test(control.value);//control.value是输入框的值,forbidden是正则结果
    return result ? { 'forbiddenName': { value: control.value } } : null;//如果匹配成功,则返回对象
  };
}

firstName:['',[forbiddenNameValidator('bob')]],

模板驱动表单

模板驱动的表单中,添加校验逻辑是以指令方式实现的

//ts
import { Directive, Input } from '@angular/core';
import { AbstractControl, NG_VALIDATORS, Validator, ValidatorFn, ValidationErrors } from '@angular/forms';
import { FormGroup } from '@angular/forms';
export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
 return (control: AbstractControl): { [key: string]: any } | null => {
  const forbidden = nameRe.test(control.value);
  return forbidden ? { 'forbiddenName': { value: control.value } } : null;
 };
}

@Directive({
 selector: '[appForbiddenName]',
 providers: [{ provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true }]
})
export class ForbiddenValidatorDirective implements Validator {
 @Input('appForbiddenName') forbiddenName: string;

 validate(control: AbstractControl): { [key: string]: any } | null {
  return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, 'i'))(control)
   : null;
 }
}
//html
<input type="text" required [(ngModel)]="model.name" name="name" appForbiddenName="bob">

总结

响应式表单需要引入ReactiveFormsModule模块,在使用时需要引入大量的指令,使用麻烦,但是添加校验逻辑简单,用户可以动态添加新的输入域,适合非固定的表单。

模板驱动的表单中,表单的数据生成很简单,在html中需要双向绑定,并且配上name属性,添加校验时要是用指令的方式,适合固定的输入表单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery pagination插件实现无刷新分页代码
Oct 13 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
Jul 02 Javascript
javascript获取所有同类checkbox选项(实例代码)
Nov 07 Javascript
JavaScript中reduce()方法的使用详解
Jun 09 Javascript
jQuery弹出遮罩层效果完整示例
Sep 13 Javascript
如何获取TypeScript的声明文件.d.ts
May 01 Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
layui layer select 选择被遮挡的解决方法
Sep 21 Javascript
浅谈TypeScript的类型保护机制
Feb 23 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 Javascript
微信小程序实现下拉加载更多商品
Dec 29 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 #Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 #Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 #Javascript
初探Vue3.0 中的一大亮点Proxy的使用
Dec 06 #Javascript
vue中v-for通过动态绑定class实现触发效果
Dec 06 #Javascript
vue通过指令(directives)实现点击空白处收起下拉框
Dec 06 #Javascript
Vue-CLI3.x 设置反向代理的方法
Dec 06 #Javascript
You might like
php访问查询mysql数据的三种方法
2006/10/09 PHP
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
python安装与使用redis的方法
2016/04/19 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python zip()函数用法实例分析
2018/03/17 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
django正续或者倒序查库实例
2020/05/19 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
护理学毕业生求职信
2013/11/14 职场文书
甜品店的创业计划书范文
2014/01/02 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android