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 相关文章推荐
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
Nov 25 Javascript
JavaScript地图拖动功能SpryMap的简单实现
Jul 17 Javascript
JQuery仿小米手机抢购页面倒计时效果
Dec 16 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
Jan 14 Javascript
实例讲解JavaScript中的this指向错误解决方法
Jun 13 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
浅谈Vue项目骨架屏注入实践
Aug 05 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
May 12 Javascript
vue element实现表格合并行数据
Nov 30 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
关于better-scroll插件的无法滑动bug(2021通过插件解决)
Mar 01 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
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
JS如何生成动态列表
2020/09/22 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python实现视频分帧效果
2019/05/31 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
python 实现两个npy档案合并
2020/07/01 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
网上开商店的创业计划书
2014/01/19 职场文书
十八届三中全会感言
2014/03/10 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
初二数学教学反思
2016/02/17 职场文书
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers