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 07 Javascript
JS 实现双色表格实现代码
Nov 24 Javascript
jQuery性能优化的38个建议
Mar 04 Javascript
Spring mvc 接收json对象
Dec 10 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
Sep 20 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
Jun 17 Javascript
Angular2 父子组件数据通信实例
Jun 22 Javascript
Django使用多数据库的方法
Sep 06 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
显示、隐藏密码
2006/07/01 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
个人简历的自荐信
2013/10/23 职场文书
初一科学教学反思
2014/01/27 职场文书
九年级化学教学反思
2014/01/28 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
2014年采购员工作总结
2014/11/18 职场文书
网吧管理制度范本
2015/08/05 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python