【发布时间】:2023-03-12 00:35:01
【问题描述】:
我创建了一个自定义异步验证器,它使用服务来验证服务器上的电子邮件。但是,这意味着每次输入一个字符时都会命中服务器,这是不好的。我在这里关注了几个我无法开始工作的答案。
我的验证者:
import {FormControl, NG_ASYNC_VALIDATORS, Validator} from
'@angular/forms';
import { Http } from '@angular/http';
import {Directive, forwardRef} from "@angular/core";
import {ValidateEmailService} from "../services/validate-email.service";
import {UserService} from "../services/user.service";
@Directive({
selector: '[appEmailValidator]',
providers: [
{ provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => EmailValidator), multi: true }
]
})
export class EmailValidator implements Validator {
public validateEmailService: ValidateEmailService;
constructor(
private _http: Http,
private _userService: UserService
) {
this.validateEmailService = new ValidateEmailService(this._http, this._userService);
}
validate(c: FormControl) {
return new Promise(resolve => {
this.validateEmailService.validateEmail(c.value)
.subscribe((res) => {
console.log(res);
if (res.valid) {
resolve(null);
} else {
resolve({
valid: {
valid: false
}
});
}
});
})
}
}
它本身运行良好,但一旦我尝试为其添加某种形式的去抖动,我最终会破坏它。
我已经尝试了this question 的答案,但我得到了Type X is not assignable to type 'Observable<any>' 等方面的错误。
我通过使用setTimeout 接近了,但最终所做的只是停止了该功能。
我的最终目标是仅在输入未更改大约 600 毫秒时才运行验证器,但会满足于每 600-2000 毫秒验证一次。
为了更加清楚,ValidateEmailService 中的 validateEmail 方法:
public validateEmail(email: string) {
let validateEmail = new ValidateEmail(email);
return this._http.get(
this.getUrl(validateEmail),
this.getOptionArgs())
.map((response: Response) => Object.assign(new UserEmailVerification(), response.json().UserEmailVerification));
}
【问题讨论】:
标签: angular typescript angular5