一、跨字段验证

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. vue3 | isRef、unref、toRef、toRefs

    isRef 检查某个值是否是ref.是返回true,否则返回false. const num = ref(10); const num1 = 20; const num2 = reactive({ d ...

  2. 《Terraform 101 从入门到实践》 Functions函数

    <Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. Terraform的函数 T ...

  3. LeetCode_单周赛_331

    2558. 从数量最多的堆取走礼物 题意 给一组数字,每秒都选择最大的一个,留下其平方根 用 最大堆就行 code class Solution { public long pickGifts(int ...

  4. Seleniumweb自动化测试01

    1.selenium简介 selenium是python的一个web第三方包,主要使用来做web自动化测试的 环境要求: ①.要有谷歌浏览器 ②.下载谷歌浏览器的驱动chromedriver(驱动我们 ...

  5. 祝 .NET 20周年生日快乐

    活动官网:https://dotnet.microsoft.com/zh-cn/

  6. java7.14

  7. vue页面加载闪烁的问题以及解决方案

    一.原因: 问题:当我们打开Vue页面的时候,如果弱网环境,会出现一个闪烁的效果下图:加载闪烁问题效果 原因:因为在浏览器中先执行html代码,先渲染Dom,然后再执行JavaScript代码,Vue ...

  8. CF1311F Moving Points

    题目传送门 思路 给出一种不需要脑子的四颗树状数组解法. 这四颗树状数组分别为:一颗维护负数,一颗维护负数个数,一颗维护正数,一颗维护正数个数. 首先考虑没有速度该怎么求. 不妨先按 \(x_i\) ...

  9. 题解 P2602 [ZJOI2010] 数字计数

    虽然说是数位 dp 入门题但是还是不是很会(悲 看了题解才做出来,中途因为各种 SB 问题调了很长时间(悲 聪明的你一定能看出来这是数位 dp,因此令 \(i\) 为当前填的位数,\(limit\) ...

  10. Me-and-My-Girlfriend-1

    Me-and-My-Girlfriend-1 目录 Me-and-My-Girlfriend-1 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 GetShell 2. ...