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 相关文章推荐
Prototype 学习 工具函数学习($A方法)
Jul 12 Javascript
MooTools 1.2中的Drag.Move来实现拖放
Sep 15 Javascript
不使用浏览器运行javascript代码的方法
Jul 24 Javascript
js html css实现复选框全选与反选
Oct 09 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
jquery实现图片上传前本地预览
Apr 28 jQuery
利用Javascript开发一个二维周视图日历
Dec 14 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
js在HTML的三种引用方式详解
Aug 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
索尼ICF-SW100收音机评测
2021/03/02 无线电
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
php创建session的方法实例详解
2015/01/27 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
javascript分页代码(当前页码居中)
2012/09/20 Javascript
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
js实现聊天对话框
2020/02/08 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
python处理RSTP视频流过程解析
2020/01/11 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
经济管理专业自荐信
2013/12/30 职场文书
三个儿子教学反思
2014/02/03 职场文书
大学生求职计划书
2014/04/30 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
校运会新闻稿
2015/07/17 职场文书
MySql数据库 查询时间序列间隔
2022/05/11 MySQL