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下拉选择框
Nov 20 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
Dec 28 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
基于canvas实现的钟摆效果完整实例
Jan 26 Javascript
简单的JS轮播图代码
Jul 18 Javascript
JS禁止查看网页源代码的实现方法
Oct 12 Javascript
js实现复选框的全选和取消全选效果
Jan 03 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
Nov 01 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
Dec 19 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
JavaScript实现捕获鼠标坐标
Apr 12 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调用时间格式的参数详解
2013/06/06 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
jQuery实现ichat在线客服插件
2014/12/29 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
webpack4简单入门实例
2018/09/06 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
vue按需加载实例详解
2019/09/06 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
vue实现选中效果
2020/10/07 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
什么是.net的Remoting技术
2016/07/08 面试题
优秀的个人求职信范文
2014/05/09 职场文书
档案信息化建设方案
2014/05/16 职场文书
行政管理专业求职信
2014/07/06 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android