要在Angular中处理验证请求处于“pending”状态时不显示自定义HTTP验证器的错误消息,可以使用RxJS中的debounceTime
操作符。这将推迟错误消息的显示,直到验证请求完成或达到指定的延迟时间。
下面是一个示例解决方案,其中包含一个自定义HTTP验证器的代码示例:
import { AbstractControl, ValidationErrors } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
export function asyncValidator(http: HttpClient) {
return (control: AbstractControl): ValidationErrors | null => {
const value = control.value;
// 发起异步请求进行验证
return http.get('https://api.example.com/validate', { params: { value } })
.pipe(
map((response: any) => {
// 根据响应结果判断是否验证通过
return response.valid ? null : { invalid: true };
})
);
};
}
import { Component } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { asyncValidator } from './async-validator';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
})
export class ExampleComponent {
form: FormGroup;
constructor(private http: HttpClient) {
this.form = new FormGroup({
input: new FormControl('', [Validators.required], [asyncValidator(this.http)])
});
}
}
debounceTime
操作符推迟错误消息的显示:import { Component } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { asyncValidator } from './async-validator';
import { debounceTime } from 'rxjs/operators';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
})
export class ExampleComponent {
form: FormGroup;
constructor(private http: HttpClient) {
this.form = new FormGroup({
input: new FormControl('', [Validators.required], [asyncValidator(this.http)])
});
// 延迟错误消息的显示
this.form.get('input').valueChanges
.pipe(debounceTime(500))
.subscribe(() => {
this.form.get('input').updateValueAndValidity({ onlySelf: true, emitEvent: false });
});
}
}
通过使用debounceTime
操作符,我们可以设置一个延迟时间(例如500毫秒),当用户在文本输入框中输入时,将推迟验证请求的发送和错误消息的显示。这样,只有当用户停止输入一段时间后,才会触发验证请求和错误消息的显示。