I am using Angular version 5.0.1 and I'm trying to fire an AsyncValidator
on a FormGroup
on a blur event on one of the FormControls
in the FormGroup
.
I can get onBlur
to work on a form control using the following:
name: ['', {updateOn: 'blur'}]
However, when I try to apply it to a FormGroup
it doesn't work.
Is it possible to only fire an AsyncValidator onBlur
on a FormGroup
, and if not, what is the best way to execute the validator only when the user has finished entering data?
My only other option at the moment is to us some sort of debounce wrapper for my validator.
Just reading through here and it appears I should be able to use updateOn: 'blur'
for a form group.
After new FormGroup(value, {updateOn: 'blur'})); new FormControl(value, {updateOn: 'blur', asyncValidators: [myValidator]})
I am using Angular version 5.0.1 and I'm trying to fire an AsyncValidator
on a FormGroup
on a blur event on one of the FormControls
in the FormGroup
.
I can get onBlur
to work on a form control using the following:
name: ['', {updateOn: 'blur'}]
However, when I try to apply it to a FormGroup
it doesn't work.
Is it possible to only fire an AsyncValidator onBlur
on a FormGroup
, and if not, what is the best way to execute the validator only when the user has finished entering data?
My only other option at the moment is to us some sort of debounce wrapper for my validator.
Just reading through here and it appears I should be able to use updateOn: 'blur'
for a form group.
Share Improve this question edited Apr 26, 2019 at 21:40 HDJEMAI 9,80048 gold badges76 silver badges98 bronze badges asked Nov 9, 2017 at 3:12 BSimpsonBSimpson 3551 gold badge3 silver badges18 bronze badgesAfter new FormGroup(value, {updateOn: 'blur'})); new FormControl(value, {updateOn: 'blur', asyncValidators: [myValidator]})
4 Answers
Reset to default 10In Angular5
Specifying the update mode is possible for both types of forms: template-driven forms
and reactive forms
.
First one is working for you. Here's the working example for reactive forms
Component.ts
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'form01',
templateUrl: './student.ponent.html',
styleUrls: ['./student.ponent.scss']
})
export class StudentComponent implements OnInit {
formTitle:string="Student registration ";
nameForm: FormGroup;
constructor() {
}
ngOnInit() {
this.nameForm = new FormGroup ({
firstname: new FormControl('', {
validators: Validators.required,
asyncValidators: [yourAsyncValidatorFunction],
updateOn: 'blur'
}),
lastname: new FormControl('', {
validators: Validators.required,
asyncValidators: [yourAsyncValidatorFunction],
updateOn: 'blur'
})
});
}
}
HTML
<form [formGroup]="nameForm" novalidate>
<div class="form-group">
<label>What's your first name? </label>
<input class="form-control" formControlName="firstname">
</div>
<div class="form-group">
<label>What's your last name?</label>
<input class="form-control" formControlName="lastname">
</div>
<button type="submit" class="btn btn-success">Submit</button>
</form>
<h3>Hello {{nameForm.value.firstname}} {{nameForm.value.lastname}}</h3>
It works on my side. Be aware that the FormBuilder may not support this yet.
this.formGroup = new FormGroup({
name: new FormControl('', {validators: []})
}, {
updateOn: 'blur'
});
I use this code snippet bining AbstractControlOptions
with FormBuilder
:
constructor(private formBuilder: FormBuilder) { }
this.signUpForm = new FormGroup(
this.formBuilder.group({
'email': ['', ValidationUtils.emailValidators()],
'fullname': ['', ValidationUtils.fullnameValidators()],
'idCard': ['', ValidationUtils.idCardValidators()],
'username': {value: '', disabled: true}
}).controls, {
updateOn: 'blur'
}
);
you can add this directive
import { Directive,Output, HostListener, EventEmitter } from '@angular/core';
@Directive({
selector: '[onBlur]'
})
export class OnBlurDirective {
// @Input('onBlur') onBlurFunction: Function;
@Output('onBlur') onBlurEvent: EventEmitter<any> = new EventEmitter();
constructor() { }
@HostListener('focusout', ['$event.target'])
onFocusout(target) {
console.log("Focus out called");
this.onBlurEvent.emit()
}
}
and use it in the HTML like this
<input type="text" (onBlur)="myFunction()"/>
and in the ponent you can define the function myFunction as you want