Skip to content

Instantly share code, notes, and snippets.

View ganqqwerty's full-sized avatar

Yuri Katkov ganqqwerty

View GitHub Profile
<h2>My form</h2>
<form [formGroup]="myForm"
(ngSubmit)="onSubmit()">
<div>
Make email mandatory <input formControlName="myCheckbox"
type="checkbox">
</div>
<div>
Email: <input formControlName="myEmailField"
ngOnInit() {
this.myForm = this.fb.group({
myCheckbox: [''],
myEmailField: ['', [
Validators.maxLength(250),
Validators.minLength(5),
Validators.pattern(/.+@.+\..+/)
]]
});
}
this.myForm.get('myCheckbox').valueChanges
.subscribe(value => {
if(value) {
this.myForm.get('myEmailField').setValidators(Validators.required)
} else {
this.myForm.get('myEmailField').clearValidators();
}
}
);
@ganqqwerty
ganqqwerty / app.component.ts
Last active June 19, 2019 21:01
Naive and buggy approach to dynamic validator
this.myForm.get('myCheckbox').valueChanges
.subscribe(value => {
if(value) {
this.myForm.get('myEmailField').setValidators(Validators.required)
} else {
this.myForm.get('myEmailField').clearValidators();
}
}
);
private emailValidators = [
Validators.maxLength(250),
Validators.minLength(5),
Validators.pattern(/.+@.+\..+/)
];
ngOnInit() {
this.myForm = this.fb.group({
myCheckbox: [''],
myEmailField: ['', this.emailValidators]
this.myForm.get('myCheckbox').valueChanges
.subscribe(value => {
if(value) {
this.myForm.get('myEmailField').setValidators(this.emailValidators.concat(Validators.required))
} else {
this.myForm.get('myEmailField').setValidators(this.emailValidators);
}
});
this.myForm = this.fb.group({
myCheckbox: [''],
myEmailField: ['', [
Validators.maxLength(250),
Validators.minLength(5),
Validators.pattern(/.+@.+\..+/)
]]
}, {
validators: [emailConditionallyRequiredValidator] // <-----
}
this.myForm = this.fb.group({
myCheckbox: [''],
myEmailField: ['', [
Validators.maxLength(250),
Validators.minLength(5),
Validators.pattern(/.+@.+\..+/)
]]
}, {
validators: [emailConditionallyRequiredValidator] // <-----
});
function emailConditionallyRequiredValidator(formGroup: FormGroup) {
if (formGroup.value.myCheckbox) {
return Validators.required(formGroup.get('myEmailField')) ? {
myEmailFieldConditionallyRequired: true,
} : null;
}
return null;
}
this.myForm = this.fb.group({
myCheckbox: [''],
myEmailField: ['', [
Validators.maxLength(250),
Validators.minLength(5),
Validators.pattern(/.+@.+\..+/),
emailConditionallyRequiredValidator
]]
})