一、跨字段验证

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. 超级容易理解的函数节流(throttle)

    今天搞了一个简单的写法 话不多说,直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  2. Flutter 耗时监控 | 路由名为空原因分析

    前言 最近群里遇到获取Route名为空的问题,当时没在意... 直到自己在监控页面启动耗时,需要确定当前页面是哪个从而方便标记它加载的耗时时,遇到同样 route.settings.name 为空问题 ...

  3. 引子 - 实现轻量的 ioc 容器

    IoC 反转控制原则也被叫做依赖注入 DI, 容器按照配置注入实例化的对象. 假设 A 的相互依赖关系如下图, 如何将 A 对象实例化并注入属性. 本文将实现一个轻量化的 IoC 容器, 完成对象的实 ...

  4. web应用开发模式、API接口、接口测试工具postman

    web应用开发模式.API接口.接口测试工具postman web开发模式 前后端混合开发模式 前后端混合开发模式是指前后端代码混合,所有的HTML代码和数据在服务器端拼接好,一次性将内容发送到客户端 ...

  5. C# 线程查漏补缺

    进程和线程 不同程序执行需要进行调度和独立的内存空间 在单核计算机中,CPU 是独占的,内存是共享的,这时候运行一个程序的时候是没有问题.但是运行多个程序的时候,为了不发生一个程序霸占整个 CPU 不 ...

  6. bash原样输出字符串中的换行

    ➜ code $ cat test.sh #!/bin/bash nr="`cat -`"\" echo "$nr" echo $nr echo &q ...

  7. 11月29日内容总结——SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引、慢查询、数据库三大范式

    目录 一.SQL注入问题 SQL注入问题引入 SQL注入概念和解决方案 二.视图 三.触发器 定义 代码 1.触发器命名有一定的规律 2.临时修改SQL语句的结束符 四.事务 事务的四大特性(ACID ...

  8. C# 编写Windows Service Windows服务程序

    一.新建项目--选择Windows 服务,输入新的项目名称,点击确定. 二.服务名称的设置.服务添加安装程序.服务程序代码 1.服务名称的设置:视图 - 解决方案资源管理器 - 你创建的服务项目 默认 ...

  9. P17_总结

    能够知道如何创建小程序项目 微信开发者工具的使用.appID 的获取 能够清楚小程序项目的基本组成结构 app.js.app.json.app.wxss.pages 文件夹 能够知道小程序页面由几部分 ...

  10. 六:spring Cloud

    六Spring Cloud 回顾之前的: javaSE 数据库 前端 Servlet HTTP Mybatis Spring SpringMVC SpringBoot Dubbo.Zookeeper. ...