Asynchronous Validators

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>
Was this page helpful?