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 相关文章推荐
select标记美化--JS式插件、后期加载
Apr 01 Javascript
json实现前后台的相互传值详解
Jan 05 Javascript
js获取域名的方法
Jan 27 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
Jul 04 Javascript
jquery层级选择器的实现(匹配后代元素div)
Sep 05 Javascript
jQuery实现的模拟弹出窗口功能示例
Nov 24 Javascript
JS设计模式之单例模式(一)
Sep 29 Javascript
Vue组件之自定义事件的功能图解
Feb 01 Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
Oct 23 Javascript
JavaScript实现打砖块游戏
Feb 25 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 动态执行带有参数的类方法
2009/04/10 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
jquery div拖动效果示例代码
2013/12/08 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
es6在react中的应用代码解析
2017/11/08 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
详细介绍Ruby中的正则表达式
2015/04/10 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python得到单词模式的示例
2018/10/15 Python
Python列表切片操作实例总结
2019/02/19 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python实现登录与注册系统
2020/11/30 Python
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
自我评价范文
2013/12/22 职场文书
工程质量承诺书范文
2014/03/27 职场文书
婚内房产协议书范本
2014/10/02 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript