I am trying to implement a custom drag and drop directive. It works, but it is very slow, and I think that slowness can be traced back to Angular 2, because I have never encountered this slowness before. Slowing occurs only when I attach an event listener to dragover or drag events (i.e. Events that are sent often), even if I do nothing, but return false in them.
Here is my directive code:
import {Directive, ElementRef, Inject, Injectable} from 'angular2/core'; declare var jQuery: any; declare var document: any; @Directive({ selector: '.my-log', host: { '(dragstart)': 'onDragStart($event)', '(dragover)': 'onDragOver($event)', '(dragleave)': 'onDragLeave($event)', '(dragenter)': 'onDragEnter($event)', '(drop)': 'onDrop($event)', } }) @Injectable() export class DraggableDirective { refcount = 0; jel; constructor( @Inject(ElementRef) private el: ElementRef) { el.nativeElement.setAttribute('draggable', 'true'); this.jel = jQuery(el.nativeElement); } onDragStart(ev) { ev.dataTransfer.setData('Text', ev.target.id); } onDragOver(ev) { return false; } onDragEnter(ev) { if (this.refcount === 0) { this.jel.addClass('my-dragging-over'); } this.refcount++; } onDragLeave(ev) { this.refcount--; if (this.refcount === 0) { this.jel.removeClass('my-dragging-over'); } } onDrop(ev) { this.jel.removeClass('my-dragging-over'); this.refcount = 0; } }
Here you will find the corresponding passage of styles:
.my-log.my-dragging-over { background-color: yellow; }
As you can see, all I do is select an element that is being dragged in yellow. And it works fast when I do not handle the dragover event, however I have to handle it to support deletion. When I handle the dragover event, everything slows down to unbearable levels!
EDIT I am using Angular beta 2.0.0-beta.8
EDIT # 2 . I tried profiling the code using the chrome profiler, these are the results:

Look at the marked line, this is strangely suspicious ...
EDIT # 3 A problem has been discovered: it is really related to detecting changes in Angular 2. The drag and drop operation in my case is performed on a very dense page with a lot of bindings and directives. When I commented on everything except this list, it worked fast again ... Now I need your help finding a solution!
EDIT # 4 SOLVED
The problem was detecting changes, but the error was not with Angular code, but with my own ineffective bindings. I had many bindings of this type:
*ngFor="#a of someFunc()"
This led to the fact that Angular did not know whether the data changed or not, and the someFunc function was called again and again, even though the data did not change during the drag and drop process. I modified these bindings to refer to simple properties in my class, and moved the code that populates them where it should have been. Everything started again with lightning speed!
Thanks!