Angular2 (NG2) Focus Directive
by Guido Tapia
September 20, 2016
Requesting focus on an input field is surprisingly hard in angular2. Especially when the input field is inside a dialog or an *ngIf that is not initially visible.
After much trial and error this is the solution I came up with. It works on my machine and my scenarios, no other guarantees provided:
import {Directive, AfterViewInit, ElementRef, DoCheck} from '@angular/core';
@Directive({ selector: '[autofocus]' })
export class Autofocus implements AfterViewInit, DoCheck {
private lastVisible: boolean = false;
private initialised: boolean = false;
constructor(private el: ElementRef) {}
ngAfterViewInit() {
this.initialised = true;
this.ngDoCheck();
}
ngDoCheck() {
if (!this.initialised) { return; }
const visible = !!this.el.nativeElement.offsetParent;
if (visible && !this.lastVisible) {
setTimeout(() => { this.el.nativeElement.focus(); }, 1);
}
this.lastVisible = visible;
}
}This directive hooks into the change detection loop and on iteration checks whether the input element marked with the attribute `[autofocus]` has become visible. If so then we request focus.
It appears to work, however there may be scenarios and edge cases where this approach is too simplistic. Give it a go and let me know how it goes.
