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 相关文章推荐
jquery实现页面关键词高亮显示的方法
Mar 12 Javascript
javascript中获取元素标签中间的内容的实现方法
Oct 08 Javascript
jquery网页日历显示控件calendar3.1使用详解
Nov 24 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
实例分析js事件循环机制
Dec 13 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
Jun 06 Javascript
Vue解析带html标签的字符串为dom的实例
Nov 13 Javascript
原生js实现二级联动菜单
Nov 27 Javascript
原生js实现自定义消息提示框
Nov 19 Javascript
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
浅谈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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
php实现简易计算器
2020/08/28 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
javascript 面向对象的JavaScript类
2010/05/04 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
python各种语言间时间的转化实现代码
2016/03/23 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
python argparser的具体使用
2019/11/10 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
为什么相对PHP黑python的更少
2020/06/21 Python
linux面试题参考答案(8)
2016/04/19 面试题
教育系毕业生中文求职信范文
2013/10/06 职场文书
师范应届生语文教师求职信
2013/10/29 职场文书
保密普查工作实施方案
2014/02/25 职场文书
品质主管岗位职责
2014/03/16 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android