Reputation: 2016
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
Upvotes: 2
Views: 5933
Reputation: 2917
Please check this solution. Instead of abstratcontrol I've used FormControl which is much easier to handle. Also you can pass the parent-child param to the custom validator as seen on this example:
ngOnInit() {
this.form = this.formBuilder.group({
name: ['', Validators.required],
email: ['', this.customVal('name')], -> you can pass the value here
});
}
Please check the stackblitz for complete solution.
https://stackblitz.com/edit/angular-custom-validator-uhhicz?file=src/app/app.component.ts
Upvotes: 1
Reputation: 2016
Found a couple ways for solving the problem:
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});
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();
})
Upvotes: 1
Reputation: 57919
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" class="form-control" placeholder="Name"
(input)="form.get('email').updateValueAndValidity()" />
Upvotes: 0
Reputation: 1941
Can you try this :
ngOnInit() {
this.form = this.formBuilder.group({
name: ['', Validators.required],
email: ['', [Validators.required, this.customVal()]],
});
}
Upvotes: 0