I am new to Angular 8 and trying to create custom async validator. Below is my code:
In my typescript file I am creating form field like below. I am using only async validator(no sync validator so passing 'null' as second parameter):
group.addControl(control.Name, this.fb.control('', null, this.phoneValidator));
Below is my async validator code:
phoneValidator(control: AbstractControl) {
if(control.value == '' || control.value == undefined || control.value == null) {
return null;
}
else {
return this.phoneValidatorServiceCall(control.value)
//.pipe(map((data: any) => {
// return (data.Response == "True" ? null : { phoneValidator: true });
//}))
.subscribe(data => {
return (data.Response == "True" ? null : { phoneValidator: true });
})
}
}
In above code I tried to use "Pipe" only it's not working so used "Subscribe" only but even this not working. Below is my service method:
phoneValidatorServiceCall(input): Observable<any> {
return this.http.post<any>('http://xxxxxxxx:xxxx/validate/phone', { 'Text': input });
}
For showing error in html I am using below code:
<mat-form-field class="example-full-width">
<input #dyInput [formControlName]="Phone" matInput [placeholder]="Phone" [required]="IsRequiredField">
<!-- For showing validation message(s) (Start) -->
<mat-error *ngFor="let v of Config.Validators">
{{ f.controls['Phone'].invalid }} // comes true only on error
{{ f.controls['Phone'].hasError("phoneValidator") }} // always coming false even for wrong input
<strong *ngIf="f.controls['Phone'].invalid && f.controls['Phone'].hasError('phoneValidator')">
{{ My Message Here }}
</strong>
</mat-error>
<!-- For showing validation message(s) (End) -->
I am facing two problems:
- It's not waiting for response from service. Somehow it's always return error from phoneValidator(control: AbstractControl) method
- Error message not showing on screen. f.controls['Phone'].hasError("phoneValidator") always coming false
aysnc await
you have to use your function asasync validationFunction() { await this.data = this.serviceCall() }
– GaurangDhordareturn this.phoneValidatorServiceCall(control.value).pipe(...)
– Andrei Gătej