一、跨字段验证

1、新增验证器

import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';

export const placeRevealedValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {
const fromPlace = control.get('fromPlace');
const toPlace = control.get('toPlace');
return fromPlace && toPlace && fromPlace.value === toPlace.value ? { 'placeRevealed': true } : null;
};

2、给 FormGroup 添加验证器

 initForm() {
this.validateForm = this.fb.group(
{
Id: [0, [Validators.required]],
fromPlace: [null, [Validators.required]],
toPlace: [null, [Validators.required]],
isValid: ['Y', [Validators.required]],
language_Cd: ['zh-tw', [Validators.required]],
},
{ validators: placeRevealedValidator }
);
}
get fromPlace() {
return this.validateForm.get('fromPlace') as any;
}
get toPlace() {
return this.validateForm.get('toPlace') as any;
}

3、页面判断(因为交叉验证设置在FormBuilder上,所以页面验证时使用FormBuilder值validateForm )

<nz-form-control>
<nz-select nzAllowClear formControlName="toPlace"
class="inputs">
<nz-option *ngFor="let item of place" [nzLabel]="item.routePlace" [nzValue]="item.routePlace">
</nz-option>
</nz-select>
<div *ngIf="validateForm.errors?.['placeRevealed'] &&fromPlace.dirty &&toPlace.dirty"
class="alert alert-danger">
出發地和目的地不能相同
</div>
</nz-form-control>

一、异步验证

1、新增验证器

import { AbstractControl,  } from "@angular/forms";
import { catchError, map, of } from "rxjs";
import { DpaService } from "src/app/services/apis/dpa.service"; export class EmpIdRevealedValidators { static EmpIdValidator(dpaService: DpaService) {
return (control: AbstractControl) => {
if (!control.valueChanges) {
return of(null);
} else {
return dpaService.GetUserByEmpId(control.value)
.pipe(
map((isTaken: any) =>{
return (isTaken.length==0 ? { 'empIdRevealed': true } : null)
} ),
catchError(() => of(null))
);
}
}
}
}

2、给 FormGroup 添加验证器

 initForm() {
this.validateForm = this.fb.group({
process: [this.process[0], [Validators.required]],
bo: [null, [Validators.required]],
site: [null, [Validators.required]],
emplId:[null,{
validators: [Validators.required],
asyncValidators:EmpIdRevealedValidators.EmpIdValidator(this.dpaService),
updateOn: 'blur' //鼠标移开后验证,还有change和submit
}],
isValid: ['Y', [Validators.required]],
});
}
get emplId() {
return this.validateForm.get('emplId') as any;
}

3、页面判断(因为交叉验证设置在FormControl上,所以页面验证时使用FormControl值emplId)

<nz-form-item>
<nz-form-label>工號</nz-form-label>
<nz-form-control>
<input nz-input [readonly]="this.apiAction==='Update'" formControlName="emplId" class="inputs">
<div *ngIf="emplId.errors?.['empIdRevealed']&&emplId.dirty "
class="alert alert-danger">
工號不存在
</div>
</nz-form-control>
</nz-form-item>

Angular响应式表单验证输入(跨字段验证、异步API验证)的更多相关文章

  1. angular响应式表单 - 状态字段

    用于表单验证的过程: touched,untoched pristine,dirty pending

  2. angular 响应式表单(登录实例)

    一.表单验证 1. 只有一个验证规则: this.myGroup = this.fb.group({ email:['hurong.cen@qq.com',Validators.required], ...

  3. angular 响应式表单

  4. angular6的响应式表单

    1:在AppModule模块里面引入 ReactiveFormsModule 要使用响应式表单,就要从@angular/forms包中导入ReactiveFormsModule,并把它添加到你的NgM ...

  5. Angular Reactive Forms -- Model-Driven Forms响应式表单

    Angular 4.x 中有两种表单: Template-Driven Forms - 模板驱动式表单 (类似于 AngularJS 1.x 中的表单 )  官方文档:https://v2.angul ...

  6. Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定

    1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...

  7. ng2响应式表单-翻译与概括官网REACTIVE FORMS页面

    本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将 ...

  8. Angular2响应式表单

    本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将 ...

  9. Angular2响应式表单-翻译与概括官网REACTIVE FORMS页面

    本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将 ...

  10. angular 响应式表单指令

    响应式表单都是以 form开头的指令 第一列指令(不以name结尾)在html模版中,用 [ ] 第二列指令(以name结尾)在html模版中,不用 [ ]

随机推荐

  1. Angularjs的重要概念

    AngularJS的重要概念 MVC模式 AngularJS最早按照MVC模式设计,在这种设计模式下,AngularJS组件可以分为: M: Model,即模型,是应用程序中用于处理应用程序数据逻辑的 ...

  2. C-08\变量类别和名称粉碎机制

    全局变量 定义:在所有函数外部定义的变量称为全局变量,一般以g_开头,如 char g_szBuf[100]; // 全局变量g_szBuf int main() { printf("%s\ ...

  3. Vue22 VueCli 脚手架

    1 简介 CLI 是 Command-Line Interface, 翻译为命令行界面, 但是俗称脚手架 Vue CLI是一个官方发布 vue.js 项目脚手架 使用 vue-cli 可以快速搭建 V ...

  4. SnowFlake 雪花算法详解与实现 & MP中的应用

    BackGround 现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性. 对于 MySQL 而言,一个表中的主键 id 一般使用自 ...

  5. 学习Java Day13

    今天学习了对象与类,类是构造对象的模板或蓝图.由类构造对象的过程称为创建类的实例.类与类之间的关系有依赖,聚合,继承. 然后学习了如何构造对象.

  6. 一牛X同学的报告分享

    https://indico.cern.ch/event/743699/contributions/3072640/attachments/1750517/2836233/ARIES_Workshop ...

  7. 基于minikube快速搭建kubernetes单节点环境

    一.说明 本文主要介绍在 Centos7 环境下基于 Minikube 来快速部署 Kubernetes 单节点集群环境,并在浏览器上访问部署在 k8s 上的 dashboard 服务. 二.Mini ...

  8. TypeScript 学习笔记 — 类的基本用法(五)

    目录 TS 中定义类 类中实例属性.方法 + 修饰符 public protected private readonly 实例方法 类中原型属性.方法 + 访问器 原型属性 + 访问器 原型方法 类中 ...

  9. JZOJ 6904. 【2020.11.28提高组模拟】T3 树上询问(query)

    题目 你有一棵 \(n\) 节点的树 ,回答 \(m\) 个询问,每次询问给你两个整数 \(l,r\) ,问存在多少个整数 \(k\) 使得从 \(l\) 沿着 \(l \to r\) 的简单路径走 ...

  10. 钓鱼攻击之:WEB 钓鱼

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. 钓鱼 ...