angular - Huge performance impact on Component's host document click (Angular2) -
so have 300 instantiations of component defines global click event listener through host property:
@component({   selector: 'value-edit',   template: ``,   host: {     "(document: click)": "onclickoff($event)",   },   changedetection: changedetectionstrategy.onpush ) export class valueeditcomponent {   onclickoff(globalevent) {     // make sure doesn't affect performance keep empty!   } }   i noticed hugely impacts performance, takes 2-3 seconds of processing after every click everywhere on document.
this js cpu profile made in chrome sequence: wait ~5 seconds, click, wait few seconds , stop recording. click huge green column on screenshot:
i've tried detaching change detector on component or parent didn't help. commenting out line "(document: click)": "onclickoff($event)", fixes problem.
may issue of framework or bad usage i'm not sure how qualify or workaround in more good-practice-way.
solution / workaround
on angular 2.0.0 (final) code below result in same performance issue:
ngafterviewinit() {     document.addeventlistener('click', evt => this.evtclickhandler) }   registering event outside "zone" should help:
constructor(zone: ngzone) { }  ngafterviewinit() {     this.zone.runoutsideangular(() => {         document.addeventlistener('click', evt => this.offclickhandler(evt))     }) }   explanation
performance issue happened again me using sortablejs library. wasn't case before final version of angular changed due registering events on native elements.
for sortablejs library did this:
this.sortedimages = sortable.create(el, options)   which resulted in bad performance while dragging elements:
solution or workaround goes this:
this.zone.runoutsideangular(() => {   this.sortedimages = sortable.create(el, options) })   where this.zone injected @angular/core/ngzone. way library registers event listeners outside of ngzone.
i have posted an issue on github problem recognized error on coding, not bug in angular. however, changes appeared between latest (rc - before final) versions.
so may bug or (latest) design don't have confirmation on this.


Comments
Post a Comment