This package is for handling focus on html elements in Angular apps. It is tightly coupled with the DOM but safe to use in server-side rendering settings since we are checking to make sure the directive is running in a browser before using any DOM-specific functions.
Install using NPM:
npm install angular-input-focus --saveNext, import the module in your application module:
import { AngularInputFocusModule } from 'angular-input-focus';
@NgModule({
imports: [AngularInputFocusModule]
})Now you're ready to use the directive in your project.
Here are some standard use cases.
For autofocus-like functionality, you can set libFocus to true (or a condition):
<!-- Focus First name when control is rendered -->
First name: <input type="text" name="fname" [libFocus]="true">
Last name: <input type="text" name="lname">You can also pass an EventEmitter<boolean> to the setFocus input. Imagine a component called MyComponent:
export class MyComponent {
// We will pass this to the directive in our view
focusEvent = new EventEmitter<boolean>();
// When called, will set the focus on our input
setFocus() {
this.focusEvent.emit(true);
}
}In the template for MyComponent:
<input [libFocus]="false" [setFocus]="focusEvent">`Whenever your focusEvent emits a value, your element will focus/blur depending on whether the emitted value is true or false. You can find a working example of this in the tester app for the project.
You don't need to use EventEmitter for this. Simply set libFocus to a conditional boolean value:
rows = ['First', 'Second'];
addRow() {
this.rows.push('');
}
shouldFocusRow(index: number): boolean {
return index + 1 === this.rows.length;
}
trackByIndex(index, row) {
return index;
}And in your template:
<button (click)="addRow()">Add row</button>
<!-- Important to use trackBy to prevent stuttering on input. -->
<div *ngFor="let row of this.rows; let i = index; trackBy: trackByIndex">
<input id="row{{ i }}" [libFocus]="shouldFocusRow(i)" [(ngModel)]="rows[i]" />
</div>It's important in general to use trackBy for dynamic inputs to avoid UI stutter as you're typing. Here's a working StackBlitz example you can run and modify.
If you're using Angular Material, Change Detection needs to run after setting focus because Angular Material tracks focus; otherwise you will get the dreaded ExpressionChangedAfterItHasBeenCheckedError exception. If you are using native HTML inputs, you can skip change detection by setting [skipChangeDetection]="true".
The main app (angular-input-focus-tester) is for testing the angular-input-focus library in the projects folder. Run ng serve to build and serve the test app.
To publish a new version of the library to NPM, run npm run publish-lib. This will do the following:
- Run
npm version patchto create a new patch. - Build the library.
- Copy readme/license from the main project to the library.
- Publish the patch on NPM.