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 相关文章推荐
Firefox window.close()的使用注意事项
Apr 11 Javascript
用js实现in_array的方法
Nov 05 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
May 22 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
node.js中的fs.fstatSync方法使用说明
Dec 15 Javascript
JavaScript判断浏览器类型的方法
Feb 10 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
使用Vue组件实现一个简单弹窗效果
Apr 23 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
vue动画打包后失效问题的解决方法
Sep 18 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 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 实现文件压缩解压操作的方法
2019/06/14 PHP
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
《悯农》教学反思
2014/04/28 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
2014年终个人工作总结
2014/11/07 职场文书
企业工会工作总结2015
2015/05/13 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
争做文明公民倡议书
2019/06/24 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技