Angular自定义表单验证
前端表单验证
为年龄输入框添加了两个验证,并分情况填写了提示语
<form nz-form [formGroup]="validateForm">
<nz-form-item>
<nz-form-label [nzSpan]="3" nzRequired>年龄</nz-form-label>
<nz-form-control [nzSpan]="8" nzHasFeedback>
<input nz-input formControlName="age" placeholder="请输入年龄">
<nz-form-explain *ngIf="validateForm.get('age').dirty && validateForm.get('age').errors">
<ng-container *ngIf="validateForm.get('age').hasError('required')">请输入年龄</ng-container>
<!--自定义验证 注意加单引号-->
<ng-container *ngIf="validateForm.get('age').hasError('isMoreThanZero')">年龄必须为数字,且大于等于0</ng-container>
</nz-form-explain>
</nz-form-control>
</nz-form-item>
</form>
[Validators.required, this.isMoreThanZero]为age字段的验证列表
其中Validators.required是Validators提供的验证,this.isMoreThanZero是自定义验证
this.validateForm = this.fb.group({
age: [null, [Validators.required, this.isMoreThanZero]], // 年龄
});
自定义isMoreThanZero的验证规则
/**
* @description 自定义表单验证:是数字并且大于等于0
*/
isMoreThanZero = (control: FormControl) => {
if (!control.value) {
return { required: true };
} else if (isNaN(Number(control.value)) || control.value < 0) {
// 注意,这里返回的是isMoreThanZero,才能对应.hasError('isMoreThanZero')
return { isMoreThanZero: true };
}
}
后端表单验证
比如,业务要求编码不重复,查询编码是否存在
设置一个叫做existSameCode的验证,当existSameCode=true,则验证失败
<nz-form-item>
<nz-form-label [nzSpan]="3" nzRequired>编码</nz-form-label>
<nz-form-control [nzSpan]="8" nzHasFeedback>
<input nz-input formControlName="code" placeholder="请输入编码">
<!--表单验证-->
<nz-form-explain *ngIf="validateForm.get('code').dirty && validateForm.get('code').errors">
<ng-container *ngIf="validateForm.get('code').hasError('required')">请输入编码</ng-container>
<ng-container *ngIf="validateForm.get('code').hasError('existSameCode')">已存在相同编码</ng-container>
</nz-form-explain>
</nz-form-control>
</nz-form-item>
设置表单验证
Tip:[默认值,[同步校验],[异步校验]]
这里this.checkData是异步校验,所以写到第三个参数的位置
this.validateForm = this.fb.group({
code: [null, [Validators.required], [this.checkData]], // 编码
});
调用testService的方法,异步查询结果
/**
* @description 自定义表单验证:查询编码是否重复
*/
checkData: AsyncValidatorFn = (control: FormControl): Promise<ValidationErrors | null> =>{
return new Promise((resolve2) => {
setTimeout(() => {
this.testService.checkData({code:control.value})
.then((response: any) => {
if (response) {
resolve2({existSameCode: true});
} else {
resolve2(null);
}
});
}, 1500);
});
}
如果存在,返回true,不存在,返回false
checkData(params): Promise<any> {
// 这里可以调用服务,验证是否存在相同编码
// 例子简化为前端验证
const pRequest =new Promise(function(resolve, reject) {
let existCodeList=['1','2','3'];
if(existCodeList.indexOf(params.code) > -1){
resolve(true);
}
resolve(false);
}).then((ret: any) => {
return ret;
});
return Promise.race([this.requestHelperService.getTimeoutPromise(), pRequest]).catch(ret => {
this.requestHelperService.handleRequestError(ret, true);
});
}
示例代码
参考资料
Validators
JavaScript Promise迷你书(中文版)
Angular自定义表单验证的更多相关文章
- angular编写表单验证
angular编写表单验证 一.整体概述 表单内容如下图,包括常用的用户名.密码.确认密码.手机.邮箱等 整体js代码很少,就一个指令用于写确认密码和密码是否相等.其他 验证都是使用angular自带 ...
- Angular5+ 自定义表单验证器
Angular5+ 自定义表单验证器 Custom Validators 标签(空格分隔): Angular 首先阐述一下遇到的问题: 怎样实现"再次输入密码"的验证(两个cont ...
- angular js 表单验证
<!doctype html> <html ng-app="myapp"> <head> <meta charset="UTF- ...
- layui 自定义表单验证的几个实例
*注:使用本方法请先引入layui依赖的layu.js和layui.css 1.html <input type="text" name="costbudget&q ...
- jquery.validate.js使用之自定义表单验证规则
jquery.validate.js使用之自定义表单验证规则,下面列出了一些常用的验证法规则 jquery.validate.js演示查看 jquery validate强大的jquery表单验证插件 ...
- angular4 自定义表单验证Validator
表单的验证条件有时候满足不了需求就可以自定义验证 唯一要求返回是ValidatorFn export interface ValidatorFn{ (c:AbstractControl):Valida ...
- angular之表单验证与ngMessages
刚接触angular1.x很多经常用到的ngMessages的地方,这里顺便记一下,效果如下图: 如果引用了angular-messages.js报如下错误,说明你的angular.js和angula ...
- element自定义表单验证
element-ui框架下修改密码弹窗进行表单验证. 除了基础校验,密码不为空,长度不小于6字符,需求中还需校验密码由数字和字母组合. 处理代码如下: <el-dialog :visible.s ...
- ElementUI使用问题记录:设置路由+iconfont图标+自定义表单验证
一.关于导航怎么设置路由 1.在el-menu这个标签的属性中添加 router ,官方文档的解释是:启用vue-router 这种模式 2.在el-menu-item标签中的index属性直接书写路 ...
随机推荐
- [Angular] Test component template
Component: import { Component, Input, ChangeDetectionStrategy, EventEmitter, Output } from '@angular ...
- Gradle自己定义插件
Gradle自己定义插件 在Gradle中创建自己定义插件,Gradle提供了三种方式: 在build.gradle脚本中直接使用 在buildSrc中使用 在独立Module中使用 开发Gradle ...
- [RxJS] Use RxJS concatMap to map and concat high order observables
Like switchMap and mergeMap, concatMap is a shortcut for map() followed by a concatAll(). In this le ...
- Android JNI编程(七)——使用AndroidStudio编写第一个JNI程序
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 1.简单介绍一下NDK和JNI NDK:NDK是Native Develop ...
- [Grid Layout] Place grid items on a grid using grid-column and grid-row
It’s possible to position a grid item anywhere on a grid track. To do this, let’s specify some grid- ...
- 基于 Android NDK 的学习之旅-----序言
前些日子做了个Android项目, 引擎层 用C的, 准备写这个系类的文章,借此跟朋友来分享下我NDK开放的经验以及自己知识的总结和备忘.希望能给需要这方面资料的朋友提供一定的帮助. 主要涉及到: ...
- Tomcat8及之后版本出现的The valid characters are defined in RFC 7230 and RFC 3986
升级tomcat8及更高版本带来的问题 由于使用get请求,链接中参数携带特殊字符,由于Tomcat的新版本中增加了一个新特性,就是严格按照 RFC 3986规范进行访问 解析,而 RFC 3986规 ...
- 微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现
原文:微服务学习笔记(2)--使用Consul 实现 MagicOnion(GRpc) 服务注册和发现 1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载w ...
- [HTML5] Focus management using CSS, HTML, and JavaScript
Something important to consider when coding a web application is managing the user's focus. For keyb ...
- 小强的HTML5移动开发之路(28)—— JavaScript回顾3
一.基本数据类型 number:数字类型 string:字符串 (注意s小写:string是基本类型) boolean:布尔类型 //前三个都有对应的包装类 null:空类型 undefined: ...