一、跨字段验证

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. 用XAMPP搭建本地:Web服务器,访问服务器,下载服务器。

    用XAMPP搭建本地:Web服务器,访问服务器,下载服务器. 首先需要下载XAMPP,链接为:XAMPP下载地址,XAMPP中文网. 下载完成后进行安装,直接一键点到底. 一.如何确定我们安装完成了? ...

  2. Dubbo-RPC核心接口介绍

    前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...

  3. Task记录1.CancellationToken 取消Task任务的操作

    //1.创建取消令牌数据 CancellationTokenSource tokenSource = new CancellationTokenSource(); //2.创建取消令牌 Cancell ...

  4. Flex布局专题

    Flex布局专题 参照 https://www.runoob.com/w3cnote/flex-grammar.html 下面是自己看代码的一下 小结,和认识,加笔记,加原文 认识容器 flex布局需 ...

  5. ElasticSearch使用教程

    一.ElasticSearch使用说明 1. 索引 index,相当于数据库表Table 1.1 查看所有索引 GET _cat/indices?v 1.2 创建索引字段映射关系 PUT /test ...

  6. 抛砖系列之k8s HorizontalPodAutoscaler(HPA)

    前言 "大伙得眼里有活,看见同事忙的时候要互相帮助,这样我们团队才能快速成长,出成绩,多干点活没坏处的,领导都看在眼里记在心里,不会亏待大伙." 看到这也许你还有点懵,不是要讲k8 ...

  7. LG P4449 & JZOJ 于神之怒

    \(\text{Problem}\) JZOJ上,求 \[\sum_{i=1}^n \sum_{j=1}^m \gcd(i,j)^k \] 对 \(10^9+7\) 取模 \(n,m,k \le 5 ...

  8. webgl 系列 —— 初识 WebGL

    初识 WebGL 什么是 WebGL webgl 在支持 canvas 的浏览器中进行 2d 或 3d 渲染. webgl 程序除了有 Html.javascript,还需要加入着色器语言(GLSL ...

  9. LeetCode-393 UTF-8编码验证

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/utf-8-validation 题目描述 给定一个表示数据的整数数组 data ,返回它是否为有 ...

  10. sqlserver 行转列 列转行

    行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和 ...