一、跨字段验证

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. 创建a标签使用get请求下载文件

    创建a标签使用get请求下载文件 let url = `${BaseUrl.path}/aa/bb/cc?no=${this.sqcode}&pae=${this.wlName}&as ...

  2. 【学习笔记】QT从入门到实战完整版(基础控件)(4)

    添加资源 将存有资源文件的文件夹放到工程目录中,如文件夹名称为 "Image",里面有 Luffy.png 文件. 在 Qt Creator 中右击工程选择[添加新文件]. 在弹出 ...

  3. vue学习笔记(二) ---- vue实例的生命周期

    vue实例的生命周期 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子:就是生命周期事件的别名而已: 生命周期钩子 = 生命周期函 ...

  4. JavaScript 疑难记录(未解决)

    异步迭代器与生成器的联系和区别

  5. .NET 支付宝SDK新版 AlipayEasySDK 配置文件详细说明

    config代码: using Tea; namespace Alipay.EasySDK.Kernel { /// <summary> /// 客户端配置参数模型 /// </su ...

  6. 【DS】2.1

    线性表:c++各种基础操作里面,有&没&避免错的代码额~ #include <stdio.h> void test(int &x){//没有&就没有带回主函 ...

  7. Sentinel熔断与限流

    1.简介 在线文档: https://sentinelguard.io/zh-cn/docs/system-adaptive-protection.html 功能: 流量控制 速率控制 熔断和限流 和 ...

  8. 关于联想对Jim博士的质疑

    对Jim博士质疑的质疑 因为关注司马南,从他的空间里看到Jim博士和其龃龉,大致看了Jim博士头条里的文章,因为看到自己常用的EPICS,上午匆忙就写了上面的文. Jim博士是去年在头条上看到的,因为 ...

  9. Activiti-25张表对应的关系以及常用接口

    Activiti-25张表对应的关系以及常用接口 Activiti工作流25张表的含义: 其他表 act_evt_log: 流程事件日志记录表 act_procdef_info: 流程定义动态变更信息 ...

  10. Ubuntu安装Zabbix6.0

    环境 系统:Ubuntu 20.04 虚拟平台:Vmware Workstation 16 PRO 软件版本:Zabbix 6.0 LTS 数据库:PostgreSQL Web服务:Apache 新建 ...