Blog>
Snippets

Cross-field Validation in Reactive Forms

Showcase how to implement custom validators that consider multiple form fields, such as password and password confirmation match validation.
import { FormGroup, FormControl, Validators } from '@angular/forms';

// Custom validator function to compare two fields
function passwordMatchValidator(g: FormGroup) {
  return g.get('password').value === g.get('confirmPassword').value
     ? null : {'mismatch': true};
}

// Creating form group with custom validator
const form = new FormGroup({
  password: new FormControl('', [Validators.required]),
  confirmPassword: new FormControl('', [Validators.required])
}, { validators: passwordMatchValidator });

// Subscribe to form value changes to detect validity
form.valueChanges.subscribe(() => {
  if (form.hasError('mismatch')) {
    form.get('confirmPassword').setErrors([{ mismatch: true }]);
  } else {
    form.get('confirmPassword').setErrors(null);
  }
});
This code creates a new FormGroup with two fields: 'password' and 'confirmPassword'. It adds a custom validator 'passwordMatchValidator' at the group level to check if both fields match. When the form value changes, it checks if there is a 'mismatch' error and updates the 'confirmPassword' field's errors accordingly.