我在通过 api 检查我的 angular 6 应用程序中是否存在用户名时遇到问题

I am having issue in checking whether a username exists or not in my angular 6 application via api

这是我的反应式表单验证码

userName: new FormControl('',[Validators.required,Validators.maxLength(50),this.checkIfUsernameExists.bind(this)])

});

这是我写在同一个文件中的验证函数

checkIfUsernameExists(control){
var that = this;
return new Promise(resolve => {
    setTimeout(() => {
        that.dashdata.checkUsernameExists(control.value).subscribe(ret=>{
        if(ret!="0"){ 
            resolve({'emailvalid': true});
        }else{
            resolve(null);
        }`enter code here`
        });
    }, 1000);        
});
}

而 html 代码就像

              <input type="text" id="username-input"  class="form-control" placeholder="Enter username"  autocomplete="email" formControlName="userName" [ngClass]="{ 'is-invalid': submitted && formfields.userName.errors }">
              <span class="invalid-feedback" *ngIf="formfields.userName.errors.emailvalid">This username already exists</span>
              <span class="invalid-feedback" *ngIf="formfields.userName.errors.required">Please enter a username</span>

您需要创建异步验证程序来检查并在 FormControl 字段上应用验证。以下是可以帮助您开发自己的虚拟代码

创建另一个文件user.validator.ts

export class ValidateUsername {
  static createValidator(service: userService) {
    return (control: AbstractControl): Observable<ValidationErrors | null> => {
      if (!control.valueChanges || control.pristine) {
        return of(null);
      } else {
        return control.valueChanges.pipe(
          debounceTime(300),
          distinctUntilChanged(),
          take(1),
          switchMapTo(service.checkUsernameExists(control.value)),
          tap(() => control.markAsTouched()),
          map((data) => (data.exist ? { userExist: true } : null))
        );
      }
    };
  }
}

并以这种方式在反应形式中使用

userName: [
                '',
                [Validators.required, Validators.maxLength(50)],
                ValidateUsername.createValidator(this.userService)
            ],

并在 HTML

<div *ngIf="username.touched && username.errors">
    <span *ngIf="formName.controls['userName']?.errors?.required">Please enter email address.</span>
    <span *ngIf="formName.controls['userName']?.errors?.pattern">Maximum
                                    {{formName.controls['userName']?.errors?.maxlength.requiredLength}} characters are
                                    allowed.</span>
    <span *ngIf="inviteForm.controls['userName']?.errors?.userExist">User already exists. </span>
    </div>
<div *ngIf="user.status === 'PENDING'">
    <span class="text-info">Checking...</span>
</div>