I have a angular 2 form wherein I have to make a field required on some condition like:
description: ['', Validators.required]
This description field will be required only on some type of a condition like:
if(true){descReq = true};
How can I achieve this, please suggest. Thanks in advance!
You can add or remove a validator based on the the value of another control on the form:
testForm: FormGroup;
constructor(private formBuilder: FormBuilder) {
this.testForm = this.formBuilder.group({
condition: [''],
description: ['']
});
this.testForm.controls['condition'].valueChanges.subscribe(result => {
if (result) {
this.testForm.controls['description'].setValidators(Validators.required);
this.testForm.controls['description'].updateValueAndValidity();
} else {
this.testForm.controls['description'].setValidators(null);
this.testForm.controls['description'].updateValueAndValidity();
}
});
}
If descReq
needs to be evaluated at run-time (rather than when its initialized), then perhaps you should create a custom validator:
import { ValidatorFn, AbstractControl } from '@angular/forms';
interface ValidationResult {
[key:string]:boolean;
}
function customValidator(condition: { required:boolean }) {
return (control: AbstractControl) :ValidationResult => {
return condition.required &&
(control.value == undefined ||
control.value == null ||
control.value.trim() =='') ?
{
'required': true
}: null;
}
}
Use like this:
description: ['', customValidator(this.reqd)]
where reqd
has been initialized earlier, and maybe even data-bound:
reqd = { required: false };
You should set the validator on the field imperatively vs declaratively.
Declaratively (your current code):
const description = new FormControl('', Validators.required);
Imperatively:
const description = new FormControl('');
if (someCondition) {
description.setValidators(Validators.required);
}