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 相关文章推荐
window.open的页面如何刷新(父页面)上层页面
Dec 28 Javascript
不同编码的页面表单数据乱码问题解决方法
Feb 15 Javascript
javascript实现在网页中运行本地程序的方法
Feb 03 Javascript
JavaScript必看小技巧(必看)
Jun 07 Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 Javascript
Html5 js实现手风琴效果
Apr 17 Javascript
JavaScript正则替换HTML标签功能示例
Mar 02 Javascript
详解Vuejs2.0之异步跨域请求
Apr 20 Javascript
详解Vue组件实现tips的总结
Nov 01 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
微信小程序利用for循环解决内容变更问题
Mar 05 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与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
学习ExtJS table布局
2009/10/08 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
简单实现JS倒计时效果
2016/12/23 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python实现配置文件备份的方法
2015/07/30 Python
Python Process多进程实现过程
2019/10/22 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
银行员工辞职信范文
2014/01/20 职场文书
知识竞赛活动方案
2014/02/18 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
食品安全汇报材料
2014/08/18 职场文书
暑期培训心得体会
2014/09/02 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
介绍信格式样本
2015/05/05 职场文书
公司处罚决定书
2015/06/24 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang