It simulates a call to the server

username.validators.ts
import { AbstractControl, ValidationErrors } from "@angular/forms";
export class UserNameValidators{
static cannotContainSpace(control: AbstractControl) : ValidationErrors | null {
if((control.value as string).indexOf(' ') >= 0)
return { cannotContainSpace: true }
return null;
}
static shouldBeUnic(control: AbstractControl) : Promise < ValidationErrors | null > {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(control.value === 'gabor')
resolve({ shouldBeUnic: true });
else
resolve(null);
}, 2000);
});
}
}
component
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { UserNameValidators } from '../common/validators/username.validators';
@Component({
...
})
export class SignupFormComponent {
form = new FormGroup({
username: new FormControl('',
Validators.required,
UserNameValidators.shouldBeUnic,
),
password: new FormControl('', Validators.required)
});
get username() {
return this.form.get('username');
}
}
HTML
<div *ngIf="username.touched && username.invalid"
class="alert alert-danger">
<div *ngIf="username.errors.required">Username is required</div>
<div *ngIf="username.errors.minlength">
Username should be minimum
{{ username.errors.minlength.requiredLength }}
charatcers
</div>
<div *ngIf="username.errors.maxlength">
Username should be maximum
{{ username.errors.maxlength.requiredLength }}
charatcers
</div>
<div *ngIf="username.errors.cannotContainSpace">
Username can not contain space
</div>
<div *ngIf="username.errors.shouldBeUnic">
This username is already taken
</div>
</div>