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 相关文章推荐
判断页面是关闭还是刷新的js代码
Jan 28 Javascript
JQuery 选项卡效果(JS与HTML的分离)
Apr 01 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
Jun 28 Javascript
JS模拟自动点击的简单实例
Aug 08 Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 Javascript
纯js和css完成贪吃蛇小游戏demo
Sep 01 Javascript
解析AngularJS中get请求URL出现的跨域问题
Dec 01 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
vue 子组件修改data或调用操作
Aug 07 Javascript
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
微信小程序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中文件上传的安全问题
2006/10/09 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
Laravel 5框架学习之表单验证
2015/04/08 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
python抓取文件夹的所有文件
2018/02/27 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
学院领导推荐信
2013/10/30 职场文书
社区工作者思想汇报
2014/01/13 职场文书
女方回门宴答谢词
2014/01/14 职场文书
五分钟演讲稿
2014/04/30 职场文书
会计学专业求职信
2014/07/17 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
收款授权委托书
2014/10/02 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android