The problem is the error message is not getting displayed even if i leave the filed blank and move to another field. I am unable to find what i am doing wrong here. Any help would be highly appreciated. if i put a breakpoints on onFormValuesChanged() it never hits the breakpoints. i have tried moving the build part of form inside the constructor but don't have any impact. I am not sure if the form's value change event is triggered or not when field value is changed angular ver : - 5.2.1 HTML Code <div> <form [formGroup]="formPersonalRecord"> <mat-input-container class="full-width-input"> <input matInput placeholder="First Name" formControlname="firstName"> <mat-error *ngIf="formErrors.firstName.required"> Please provide name. </mat-error> </mat-input-container> <mat-input-container class="full-width-input"> <input matInput placeholder="Last Name" formControlname="lastName"> </mat-input-container> <mat-input-container class="full-width-input"> <input matInput placeholder="Father's Name" formControlname="fatherName"> </mat-input-container> <mat-input-container class="full-width-input"> <input matInput placeholder="Email" formControlname="email"> <mat-error *ngIf="formErrors.email.required"> Please provide a email name. </mat-error> </mat-input-container> </form> </div> component.cs import { Component, OnInit } from '@angular/core'; import { EmployeePersonalRecord } from '../employee/employee-personal-record'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { fuseAnimations } from '../../core/animations'; import { HrService } from '../hr.service'; @Component({ // tslint:disable-next-line:component-selector selector: 'app-add-employee', templateUrl: './add-employee.component.html', styleUrls: ['./add-employee.component.scss'], animations: fuseAnimations }) export class AddEmployeeComponent implements OnInit { employeePersonalRecord: EmployeePersonalRecord = {} as EmployeePersonalRecord; public formPersonalRecord: FormGroup; formErrors: any; constructor(private builder: FormBuilder, private service: HrService) { } onFormValuesChanged() { for ( const field in this.formErrors ) { if ( !this.formErrors.hasOwnProperty(field) ) { continue; } // Clear previous errors this.formErrors[field] = {}; // Get the control const control = this.formPersonalRecord.get(field); if ( control && control.dirty && !control.valid ) { this.formErrors[field] = control.errors; } } } ngOnInit() { this.formPersonalRecord = this.builder.group({ firstName: ['', Validators.required], lastName: ['', Validators.required], email: ['', Validators.required], fatherName: ['', Validators.required], dateOfBirth: ['', Validators.required], addressPermanent: ['', Validators.required], addressCurrent: ['', Validators.required], gender: ['', Validators.required], maritalStatus: ['', Validators.required], religion: ['', Validators.required], cast: ['', Validators.required] }); this.formErrors = { firstName: {}, lastName: {}, email: {}, fatherName: {}, dateOfBirth: {}, addressPermanent: {}, addressCurrent: {}, gender: {}, maritalStatus: {}, religion: {}, cast: {} }; this.formPersonalRecord.valueChanges.subscribe(() => { this.onFormValuesChanged(); }); } } Continue reading...