程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8?

开发过程中遇到返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8的问题如何解决?下面主要结合日常开发的经验,给出你关于返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8的解决方法建议,希望对你解决返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8有所启发或帮助;

我正在尝试为我的注册表单创建自定义异步验证器,用于检查电子邮件是否为有效电子邮件或未使用第三方 API。这是 API 网站的参链接 -

https://www.zerobounce.net/email-validation-api.html

我正在尝试使用 RxJs debounCETime、disTinctUntilChanged 来实现它。在表单控件中,我还有两个需要验证和模式。但我总是收到此错误 - 错误:预期验证器返回 Promise 或 Observable。

我搜索了几个示例,但没有任何效果。提前致谢。

验证器 -

return dismissible(
  direction: dismissDirection.down,ondismissed: (_) => Navigator.pop(context),child: Scaffold(
    body: Container(),),);

注册组件 -

export class UniqueEmailValIDator{
   static createValIDator(_AJAXservice : AJAXservicE){
        return (control : AbstractControl) =>{
            const APIKey = environment.emailValIDatationKey;
            const baseUrl = 'https://API.zerobounce.net/v2/valIDate?';
            if(control.valID){
                return control
                .valueChanges
                .pipe(
                    debounCETime(800),disTinctUntilChanged(),switchMap((email : String) => _AJAXservice.APICall('',`${BaseUrl}API_key=${APIKey}&email=${email}&ip_address=''`,'GET',truE)),map(res => res.Json()),map((valIDationStatus : any) => {
                        if (
                            valIDationStatus.status == "valID" &&
                            valIDationStatus.mx_found == "true"
                        ) {
                            return null
                        } else {
                            return { isEmailinvalID : true }
                        }
                    })
                )
            }
        }
    }
}

解决方法

为什么要从 valueChanges Observable 管道验证器 Observable?这没有多大意义,因为验证器在 valueChange 上运行并且在它脏的时候运行。并且您还仅在控件有效时返回所需的 Observable。因此,当同步验证器将控件标记为 Invalid 时,此控件不会返回 Observable。我想这就是导致错误的原因。

试试这个方法

export class UniqueEmailValidator {
  static createValidator(_ajaxservice: AjaxservicE) {
    return (control: AbstractControl) => {
      const apiKey = environment.emailValidatationKey;
      const baseUrl = 'https://api.zerobounce.net/v2/validate?';

      return timer(800).pipe(
        concatMap((email: String) =>
          _ajaxservice.apiCall('',`${BaseUrl}api_key=${apiKey}&email=${email}&ip_address=''`,'GET',truE)
        ),map(res => res.json()),map((validationStatus: any) => {
          if (validationStatus.status == 'valid' && validationStatus.mx_found == 'true') {
            return null;
          } else {
            return { isEmailInvalid: true };
          }
        })
      );
    };
  }
}}

我在一个项目中使用与此类似的方法,我必须检查文件系统上的导出路径。我不太确定的一件事是disTinctUntilChanged。不是已经过滤了吗

,

这就是我的结果,解决了我的问题 -

验证器 -

export class UniqueEmailValidator {
    static createValidator(_ajaxservice: AjaxservicE) {
        let validatorSubject$ = new Subject();
        let debouncedSubject$ = new Subject<String>();

        debouncedSubject$
        .pipe(debounCETime(500),disTinctUntilChanged())
        .subscribe((email: String) => {
            const apiKey = environment.emailValidatationKey;
            const baseUrl = 'https://api.zerobounce.net/v2/validate?';
            _ajaxservice.apiCall('',truE).subscribe({
                next: (validationData : IEmailValidation) => {
                    if (
                        validationData.status == "valid" &&
                        validationData.mx_found == "true" &&
                        (
                          validationData.sub_status == "alias_address" ||
                          validationData.sub_status == ""
                        )
                    ) {
                        return null
                    } else {
                        return { isEmailInvalid : true }
                    }
                },error: (validationFailed) => {
                    console.log(
                        "Failed to validate the Email Address",validationFailed
                    );
                },});
        });

        return (
            control: AbstractControl
        ):
        | Promise<ValidationErrors | null>
        | Observable<ValidationErrors | null> => {
            debouncedSubject$.next(control.value);
            let promise = new Promise<any>((resolve,reject) => {
              validatorSubject$.subscribe((result) => resolve(result));
            });
            return promise;
        };
    }
}

组件 TS -

this.registration = this._formBuilder.group({
  firstName: new FormControl('',[
    Validators.required,Validators.pattern('^[a-z A-Z]+$')
  ]),lastName: new FormControl('',email: new FormControl('',Validators.pattern('[A-Za-z0-9._%-]+@[A-Za-z0-9._%-]+\\.[a-z]{2,3}')
  ],UniqueEmailValidator.createValidator(this._ajaxservicE))
}) 

组件 HTML -

<div *ngIf="formcontrol.email.errors.isEmailInvalid">
   <p>Use a working E-mail address.</p>
</div>

大佬总结

以上是大佬教程为你收集整理的返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8全部内容,希望文章能够帮你解决返回 Promise 或 Observable 的验证器:自定义异步验证器:Angular 8所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:8返回