【发布时间】:2016-06-15 20:33:58
【问题描述】:
我正在尝试实现自定义拖放指令。它可以工作,但是速度非常慢,我认为可以跟踪到 Angular 2,因为我以前从未遇到过这种缓慢。仅当我将事件侦听器附加到 dragover 或 drag 事件(即频繁发送的事件)时才会发生缓慢,即使我什么都不做,只是在其中返回 false。
这是我的指令代码:
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;
}
}
以下是相关的样式表摘录:
.my-log.my-dragging-over {
background-color: yellow;
}
正如您所见,我所做的只是用黄色突出显示被拖动的元素。当我不处理dragover 事件时,它运行得很快,但是我必须 处理它以支持丢弃。当我处理dragover 事件时,一切都会慢到无法忍受的程度!!
编辑我正在使用 angular beta 2.0.0-beta.8
EDIT #2 我尝试使用 chrome 的分析器分析代码,结果如下:
看看标出的线,莫名的可疑……
EDIT #3 发现问题:确实是由于 Angular 2 的变更检测。在我的例子中,拖放操作是在一个非常密集的页面上完成的,其中包含很多绑定和指令。当我注释掉除给定列表之外的所有内容时,它再次运行得很快......现在我需要你的帮助来找到解决方案!
【问题讨论】:
-
能否简单解释一下问题的原因是什么?读完这个问题我不太明白...
-
很可能是因为 ng2 和 jQuery 的混合,你试过只依赖 ng2 + RxJS 吗? plnkr.co/edit/LD5FJaI4OOFbKfvhjD4e?p=preview
-
这不是原因,抱歉,我尝试删除 jQuery 的所有痕迹。结果相同。
-
那么你必须提供一个复制品。我在我的 plnkr 中看不到相同的行为。
-
@EricMartinez 这是一个 plnkr plnkr.co/edit/cY1Adg5M8Ox0Ss4a6jSn?p=preview 奇怪的是它不会在那里发生!!!你愿意看看我原来的网站,看看有什么不同吗?是吗?
标签: drag-and-drop angular angular2-directives