我在通过 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>
这是我的反应式表单验证码
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>