How to focus on a field?
If you are using Angular CDK, you can set focus using FocusMonitor.focusVia
method that is part of @angular/cdk/a11y
Accessibility module (A11yModule).
This way you can avoid any DOM manipulation and avoid referencing nativeElement
altogether.
import { FocusMonitor } from '@angular/cdk/a11y';
export class ExampleComponent implements AfterViewInit {
@ViewChild('elem', {static: false}) elemRef;
constructor(private focusMonitor: FocusMonitor) {
}
ngAfterViewInit() {
// Programmatically set focus. Focus source is 'program'.
this.focusMonitor.focusVia(this.elemRef, 'program');
}
}
The invokeElementMethod
is deprecated, and will not find its way back into the new renderer. To set focus to an element, you can simply use this now:
element.nativeElement.focus();
If you are using document.querySelectorAll
, you are doing something not the angular way, and you should find another way to do it. If there is no other way to do it, then the same principle applies. The focus()
method is plain javascript, so you can use it within angular2/typescript. Be sure to do the querySelectorAll
inside the ngAfterViewInit
hook of the component though:
ngAfterViewInit() {
let inputField: HTMLElement = <HTMLElement>document.querySelectorAll('.dialog input')[0];
inputField && inputField.focus();
}
Also you can use selectRootElement method of Renderer2.
For example:
constructor(private renderer: Renderer2) {}
this.renderer.selectRootElement('#domElementId').focus()
, where domElementId is id='domElementId' in your html
template reference variable :#inlineEditControl
<input #inlineEditControl class="form-control form-control-lg" [placeholder]="label">
@ViewChild('inlineEditControl') inlineEditControl: ElementRef; // input DOM element
this.inlineEditControl.nativeElement.focus();