Package Exports
- @tinkoff/ng-event-plugins
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@tinkoff/ng-event-plugins) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Angular Event Plugins
@tinkoff/ng-event-plugins is a tiny (1KB gzip) library for optimizing change detection cycles for performance sensitive events (such as touchmove, scroll, drag etc.) and declarative preventDefault() and stopPropagation().
How to use
Add new providers to your app module:
import {NgModule} from '@angular/core'; import {NG_EVENT_PLUGINS} from '@tinkoff/ng-event-plugins'; // <-- THIS @NgModule({ bootstrap: [ /*...*/ ], imports: [ /*...*/ ], declarations: [ /*...*/ ], providers: NG_EVENT_PLUGINS, // <-- GOES HERE }) export class AppModule {}
Use new modifiers for events in templates and in
@HostListener
:.stop
to call stopPropagation() on event.prevent
to call preventDefault() on event.silent
to call event handler outside Angular'sNgZone
For example:
<div (mousedown.prevent)="onMouseDown()"> Clicking on this DIV will not move focus </div>
<div (click.stop)="onClick()"> Clicks on this DIV will not bubble up </div>
<div (mousemove.silent)="onMouseMove()"> Callbacks to mousemove will not trigger change detection </div>
You can also re-enter
NgZone
and trigger change detection, using@shouldCall
decorator that takes a predicate function as argument:
<div (scroll.silent)="onScroll($event.currentTarget)">
Scrolling this DIV will only trigger change detection and onScroll callback if it is
scrolled to bottom
</div>
import {shouldCall} from '@tinkoff/ng-event-plugins';
export function scrollFilter(element: HTMLElement): boolean {
return element.scrollTop === element.scrollHeight - element.clientHeight;
}
// ...
@shouldCall(scrollFilter)
onScroll(_element: HTMLElement) {
this.someService.requestMoreData();
}
All examples above work the same when used with
@HostListener
andCustomEvent
Important notes
Predicate is called with the same arguments as the decorated method and in the context of class instance (has access to
this
)Decorated method will be called and change detection triggered if predicate returns
true
.Predicates must be exported named function for AOT, arrow functions will trigger build error.
.silent
modifier will not work with built-in keyboard pseudo-events, such askeydown.enter
orkeydown.arrowDown
since Angular re-entersNgZone
inside internal handlers.
Demo
You can try this interactive demo
Open-source
Do you also want to open-source something, but hate the collateral work? Check out this Angular Open-source Library Starter we’ve created for our projects. It got you covered on continuous integration, pre-commit checks, linting, versioning + changelog, code coverage and all that jazz.