Angular8基础应用之表单及其验证


Posted in Javascript onAugust 11, 2019

一、前提

  • 必要性:特别必要
  • 意义:很有意义

二、正文

(一)、新建表单(模板表单)

1、新建名称为formValidator的ng项目——命令行输入ng new formValidator;

2、修改pakage.json文件——添加参数,方便开发,命令行输入npm start启动项目;

"scripts": {
 "ng": "ng",
 "start": "ng serve --open --port 4210",//修改端口号&自动打开默认浏览器窗口
 "build": "ng build",
 "test": "ng test",
 "lint": "ng lint",
 "e2e": "ng e2e"
 },

3、新建组件,命令行输入ng g c templateForm --spec false;

4、将app.components.html中的内容,替换成<app-template-form></app-template-form>

5、在app.module.ts中引入FormModul并在import中使用;

6、书写formValidator组件

//template-form.html
 <div class="container">
  <form (ngSubmit)="save()" #myForm="ngForm">
  <input 
   type="text" 
   [(ngModel)]="name" //双向数据绑定
   name="name" //使用form时必须定义,可以理解为当前控件的名字
   #myName="ngModel" //检查当前控件状态的出口,应用:myName.valid、myName.errors等
   autocomplete="off" //关闭浏览器自带的显示历史记录 h5新属性
   [appVerifyName]="nameList" //添加验证器
  >
  <!--invalid是否验证成功-->
  <!--dirty是否改变-->
  <!--touched是否被抚摸过-->
  <div *ngIf="myName.invalid && (myName.dirty || myName.touched)">
   <div *ngIf="myName.errors.required">
    名称为必填项
   </div>
   <div *ngIf="myName.errors.repeat">
    名称重复
   </div> 
  </div>
  <button type="submit" [disabled]="!myForm.form.valid">提交</button> //验证通过才能提交 
  </form>
 </div>
//template-form.ts
  ...
  
  name: string;
  
  nameAry:string[] = ['zhangsan','lisi','wangwu'];
  
  constructor() { }

  ngOnInit() {}
  
  save(): void{
    console.log('save 发请求')
  }
  ...

(二)、验证表单

1、新建指令,用于验证ng g c d share/verifyName

2、在share目录下新建nameValidator.ts,用于书写验证函数

//share/nameValidator.ts
  
  import { ValidatorFn, AbstractControl } from "@angular/forms";

  export function nameValidator(nameList: string[]): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } | null => {
      //依据指令中传递进来的名称列表进行判断,如果包含,就返回一个对象,对象的key将
      //作为模板(template-form.html)中被验证的控件的erros的key,如果不包含返回null
      //表示验证通过
      return nameList.includes(control.value) ? { 'repeat': { value: control.value } } : null;
    };
  }

3、书写指令——验证名称不能重复

//verify-name.directive.ts
  
  import { Directive, Input } from '@angular/core';
  import { Validator, NG_VALIDATORS, AbstractControl } from '@angular/forms';
  import { nameValidator } from './nameValidator';
  
  @Directive({
   selector: '[appVerifyName]',
   providers: [{
    provide: NG_VALIDATORS,
    useExisting: VerifyNameDirective,
    multi: true
   }]
  })
  export class VerifyNameDirective implements Validator { //实现Validator接口
  
   @Input('appVerifyName') //接收验证规则(reg),或者你希望传到指令中的什么
   nameList: string[];
  
   validate(control: AbstractControl): { [key: string]: any } | null {
    return this.name ? nameValidator(nameList)(control) : null
   }
  }

三、碎碎念

如果只有一个表单或者项目比较小巧,用这样的验证机制,我认为是不太明智的(用ng都没必要),随便弄个计数器或者标识位就能达到dirty和touched的效果,反之,大概率上没有一个项目有一万个表单控件,定义9000个验证规则的,所以可以高度复用,而且维护起来也灵活一些

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
指定js可访问其它域名的cookie的方法
Sep 18 Javascript
javascript 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
如何使用Javascript正则表达式来格式化XML内容
Jul 04 Javascript
JS随机漂浮广告代码具体实例
Nov 19 Javascript
javascript字符串函数汇总
Dec 06 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
深入浅析search 搜索框的写法
Aug 02 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
jQuery接受后台传递的List的实例详解
Aug 02 jQuery
vue 实现axios拦截、页面跳转和token 验证
Jul 17 Javascript
Vue v-for循环之@click点击事件获取元素示例
Nov 09 Javascript
使用原生javascript开发计算器实例代码
Feb 21 Javascript
浅谈javascript错误处理
Aug 11 #Javascript
axios异步提交表单数据的几种方法
Aug 11 #Javascript
node.js实现带进度条的多文件上传
Mar 27 #Javascript
基于Express框架使用POST传递Form数据
Aug 10 #Javascript
Vue实现点击显示不同图片的效果
Aug 10 #Javascript
vue+eslint+vscode配置教程
Aug 09 #Javascript
一个手写的vue放大镜效果
Aug 09 #Javascript
You might like
一个多文件上传的例子(原创)
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
php实现多城市切换特效
2015/08/09 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
微信小程序左右滑动的实现代码
2017/12/15 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
Python计算已经过去多少个周末的方法
2015/07/25 Python
python正则表达式之作业计算器
2016/03/18 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
在django view中给form传入参数的例子
2019/07/19 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
2014公司党员自我评价范文
2014/09/11 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
大二学生自我检讨书
2014/10/23 职场文书
写给医院的感谢信
2015/01/22 职场文书
白鹤梁导游词
2015/02/06 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书