145

How do you detect an onBlur event in Angular2? I want to use it with

<input type="text">

Can anyone help me understand how to use it?

Francesco Borzi
  • 56,083
  • 47
  • 179
  • 252
Ignat
  • 3,727
  • 6
  • 16
  • 17

9 Answers9

264

Use (eventName) while binding event to DOM, basically () is used for event binding. Also, use ngModel to get two-way binding for myModel variable.

Markup

<input type="text" [(ngModel)]="myModel" (blur)="onBlurMethod()">

Code

export class AppComponent { 
  myModel: any;
  constructor(){
    this.myModel = '123';
  }
  onBlurMethod(){
   alert(this.myModel) 
  }
}

Demo


Alternative 1

<input type="text" [ngModel]="myModel" (ngModelChange)="myModel=$event">

Alternative 2 (not preferable)

<input type="text" #input (blur)="onBlurMethod($event.target.value)">

Demo


For a model-driven form to fire validation on blur, you could pass updateOn parameter.

ctrl = new FormControl('', {
   updateOn: 'blur', //default will be change
   validators: [Validators.required]
}); 

Design Docs

Pankaj Parkar
  • 134,766
  • 23
  • 234
  • 299
16

You can also use (focusout) event:

Use (eventName) for while binding event to DOM, basically () is used for event binding. Also you can use ngModel to get two way binding for your model. With the help of ngModel you can manipulate model variable value inside your component.

Do this in HTML file

<input type="text" [(ngModel)]="model" (focusout)="someMethodWithFocusOutEvent($event)">

And in your (component) .ts file

export class AppComponent { 
 model: any;
 constructor(){ }

 /*
 * This method will get called once we remove the focus from the above input box
 */
 someMethodWithFocusOutEvent() {
   console.log('Your method called');
   // Do something here
 }
}
Aniket kale
  • 609
  • 7
  • 23
  • @Aniketkale If I put an alert in your method `someMethodWithFocusOutEvent` the program enters into a loop as the alert makes the field lose its focus, is there a way to fix this? – ps0604 Oct 23 '19 at 16:00
6

you can use directly (blur) event in input tag.

<div>
   <input [value]="" (blur)="result = $event.target.value" placeholder="Type Something">
   {{result}}
</div>

and you will get output in "result"

Falko
  • 17,076
  • 13
  • 60
  • 105
Apurv Chaudhary
  • 1,672
  • 3
  • 30
  • 55
3

HTML

<input name="email" placeholder="Email"  (blur)="$event.target.value=removeSpaces($event.target.value)" value="">

TS

removeSpaces(string) {
 let splitStr = string.split(' ').join('');
  return splitStr;
}
1
/*for reich text editor */
  public options: Object = {
    charCounterCount: true,
    height: 300,
    inlineMode: false,
    toolbarFixed: false,
    fontFamilySelection: true,
    fontSizeSelection: true,
    paragraphFormatSelection: true,

    events: {
      'froalaEditor.blur': (e, editor) => { this.handleContentChange(editor.html.get()); }}
Vojtech Ruzicka
  • 16,384
  • 15
  • 63
  • 66
1

This is the proposed answer on the Github repo:

// example without validators
const c = new FormControl('', { updateOn: 'blur' });

// example with validators
const c= new FormControl('', {
   validators: Validators.required,
   updateOn: 'blur'
});

Github : feat(forms): add updateOn blur option to FormControls

1

Try to use (focusout) instead of (blur)

Kevin Black
  • 886
  • 1
  • 8
  • 7
1

Another possible alternative

HTML Component file:

<input formControlName="myInputFieldName" (blur)="onBlurEvent($event)">

TypeScript Component file:

import { OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

export class MyEditComponent implements OnInit {

    public myForm: FormGroup;
    
    constructor(private readonly formBuilder: FormBuilder) { }
    
    ngOnInit() {

        this.myForm = this.formBuilder.group({
            
            myInputFieldName: ['initial value', { validators: [Validators.required, Validators.maxLength(100), anotherValidator], updateOn: 'blur' }],

        });
    }

    onBlurEvent(event) {
        
        // implement here what you want

        if (event.currentTarget && event.currentTarget.value && event.currentTarget.value !== '') { }

    }
}
Kevy Granero
  • 643
  • 5
  • 17
0

I ended up doing something like this in Angular 14

<form name="someForm" #f="ngForm" (ngSubmit)="onSubmit(f)"> ...
<input
 matInput
 type="email"
 name="email"
 autocomplete="email"
 placeholder="EMAIL"
 [ngModel]="payload.email"
  #email="ngModel"
  (blur)="checkEmailBlur(f)"
  required
  email
  tabindex="1"
  autofocus
 />

then ... in .ts

 checkEmailBlur(f: NgForm) {
     const email = f.value.email;
taggartJ
  • 277
  • 2
  • 6