10

How to conditionally validate a field based on another field's value? Here's what i've tried but it seems not to work

this.PDform = _formbuilder.group({
    [...]
    'intlNumber': ['',this.nationality == 'Abroad' ? Validators.compose([Validators.pattern(this.phoneNumberExp), Validators.maxLength(14), Validators.minLength(11), Validators.required]) : Validators ]
    [...]
})
James Z
  • 12,209
  • 10
  • 24
  • 44
hopeforall
  • 401
  • 1
  • 6
  • 20
  • Is `this.nationality` supposed to be another form control? or? – Brandon Taylor Oct 21 '18 at 00:54
  • Possible duplicate of [Conditional validation in Angular 2](https://stackoverflow.com/questions/45137545/conditional-validation-in-angular-2) – User3250 Oct 21 '18 at 01:37
  • 1
    For multiple property validation, it may be better to use one validator, that triggers whenever any input will change in that group of properties. There is a way to do this by grouping those properties in a sub form. – HDJEMAI Oct 21 '18 at 01:58
  • Does this answer your question? [Angular 4 form validation on multiple fields](https://stackoverflow.com/questions/47347448/angular-4-form-validation-on-multiple-fields) – JayChase Feb 23 '20 at 10:23

1 Answers1

15

You can change the validators for a form control when the value of another form control changes by subscribing to the valueChanges observable provided by the form control instance:

const control1 = <FormControl>this.form.get('control1');
const control2 = <FormControl>this.form.get('control2');

control1.valueChanges.subscribe(value => {
  if (value === 'first-condition') {
    control2.setValidators([Validators.required, ...])
  }
  else {
    control2.setValidators(null);
  }

  control2.updateValueAndValidity();
});

This is a contrived example, but the pattern can be adapted for your use case. Don't forget to assign the subscription to your view model and unsubscribe when your control is destroyed.

Here's a StackBlitz example: https://stackblitz.com/edit/conditional-validation

Brandon Taylor
  • 33,823
  • 15
  • 104
  • 144