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正则匹配换行问题实现代码
Dec 10 Javascript
JavaScript实现x秒后自动跳转到一个页面
Jan 03 Javascript
jquery ztree异步搜索(搜叶子)实践
Feb 25 Javascript
Javascript动画效果(2)
Oct 11 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
Dec 26 Javascript
使用InstantClick.js让页面提前加载200ms
Sep 12 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
微信小程序开发之tabbar图标和颜色的实现
Oct 17 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
Apr 30 Javascript
四十九个javascript小知识实用技巧
Nov 20 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
用PHP函数解决SQL injection
2006/10/09 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
PHP代码加密的方法总结
2020/03/13 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
python3 爬取图片的实例代码
2018/11/06 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python集合删除多种方法详解
2020/02/10 Python
keras的三种模型实现与区别说明
2020/07/03 Python
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
EJB的角色和三个对象
2015/12/31 面试题
服装设计专业毕业生推荐信
2013/11/09 职场文书
财务会计自荐信范文
2014/02/21 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android