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中Math对象使用说明
Jan 16 Javascript
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
Oct 11 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
Jun 19 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
Jun 01 Javascript
jQuery实现异步获取json数据的2种方式
Aug 29 Javascript
jquery+php实现搜索框自动提示
Nov 28 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
从vue源码解析Vue.set()和this.$set()
Aug 30 Javascript
跨域请求两种方法 jsonp和cors的实现
Nov 11 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 Javascript
通过javascript实现扫雷游戏代码实例
Feb 09 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
php mysql 封装类实例代码
2016/09/18 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
2020/11/06 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
Python自省及反射原理实例详解
2020/07/06 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
后勤工作职责
2013/12/22 职场文书
人力资源经理自我评价
2014/01/04 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
政风行风建设责任书
2014/07/23 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
2015年团支部工作总结
2015/04/03 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers