I have a reactive form as following:
this.form = this.formBuilder.group({
name: ['', Validators.required],
email: ['', this.customValidator()]
});
I also have a "submit" button with a [disabled]
condition:
<button [disabled]="form.invalid" (click)="create()">Create</button>
If email
input is untouched and I modify name
input, customValidator
is not fired and Create
button enables despite the customValidator()
would return an error.
On the other hand, the name
control has a Validators.required
validation that is fired even if the input is untouched, which is the desired behaviour.
Example on stackblitz: I want the
name
has value on it even if
CodePudding user response:
Can you try this :
ngOnInit() {
this.form = this.formBuilder.group({
name: ['', Validators.required],
email: ['', [Validators.required, this.customVal()]],
});
}
CodePudding user response:
As Iñigo say, a FormControl only is "validate" if is modify the input or if you call manually to "updateValueAndValidity".
So another way is subscribe to form.get('name').valueChange (not forget unsubscribe)
this.form.get('name').valueChange.subscribe(_=>{
this.form.get('email').updateValueAndValidity()
})
Or we can use input event in .html
<input formControlName="name" placeholder="Name"
(input)="form.get('email').updateValueAndValidity()" />
CodePudding user response:
Found a couple ways for solving the problem:
1 Angular cross-validation.
The custom validator is applied to the FormGroup
and not to the FormControl
. The validation is executed every time the form is modified.
this.form = this.formBuilder.group({
name: ['', Validators.required],
email: ['']
}, { validators: this.customValidator});
2 Subscribe to form valueChanges updateValueAndValidity.
this.form = this.formBuilder.group({
name: ['', Validators.required],
email: ['', this.customValidator()]
});
And on ngOnInit, whenever the form changes, the validation is executed:
this.form.valueChanges.subscribe(x => {
this.form.get('email').updateValueAndValidity();
})