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 相关文章推荐
JavaScript 继承详解(二)
Jul 13 Javascript
在javascript将NodeList作为Array数组处理的方法
Jul 09 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
javascript动画算法实例分析
Jul 31 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
浅析JS获取url中的参数实例代码
Jun 14 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
微信小程序实现打卡日历功能
Sep 21 Javascript
使用jQuery动态设置单选框的选中效果
Dec 06 jQuery
vue实现滑动到底部加载更多效果
Oct 27 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
PHP新手上路(十二)
2006/10/09 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP安全防范技巧分享
2011/11/03 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
常见python正则用法的简单实例
2016/06/21 Python
python实现狄克斯特拉算法
2019/01/17 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
海蓝之谜(LA MER)澳大利亚官方商城:全球高端奢华护肤品牌
2017/10/27 全球购物
触电现场处置方案
2014/05/14 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
会计出纳岗位职责
2015/03/31 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
尼克胡哲观后感
2015/06/08 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android