私はカスタムのドラッグアンドドロップディレクティブを実装しようとしています。それは動作しますが、それは非常に遅いです、私は遅いことが以前にこの遅さに遭遇したことがないのでAngular 2に追跡することができると思います。遅いのは、dragover
またはdrag
イベント(頻繁に送信されるイベント)にイベントリスナーをアタッチしたときに発生します。何もしない場合でも、false
が返されます。ここで角度2のドラッグ&ドロップディレクティブが極端に遅い
は私の指示のコードは次のとおりです。あなたは私がやっているすべては黄色で、ドラッグされた要素を強調している見ることができるように
.my-log.my-dragging-over {
background-color: yellow;
}
:ここ
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;
}
}
は、関連するスタイルシートの抜粋です。そして、私がdragover
イベントを処理していないときは速く動作しますが、私ははが落としをサポートする必要があります。 dragover
イベントを処理すると、すべてが耐え難いレベルにまで減速します!!
EDIT私は、角度ベータ2.0.0-beta.8を使用しています
EDIT#2私はChromeのプロファイラーを使用してコードをプロファイリングしようとした、これらは結果である:
は、マークされた行を見て、それは奇妙に疑わしいです...
EDIT#3問題が見つかりました:実際には角度2の変化の検出によるものです。私の場合のドラッグアンドドロップ操作は、多くのバインディングとディレクティブを持つ非常に密集したページで行われます。私が与えられたリスト以外の全てをコメントアウトしたとき、それは再び速く働いた...今、私はあなたの助けを必要としてこれに解決策を見つける!
EDIT#4は、問題が実際に検出を変更したが、障害が角度のコードではなく、むしろ自分の非効率的なバインディングではなかった
を解決しました。私はこの種の多くのバインディングを持っていた:
*ngFor="#a of someFunc()"
このデータは、ドラッグ&ドロップ処理中に変更されなかったにもかかわらず、再びデータが変更またはない、と機能someFunc
が再び呼び出さなったしたかどうかわからないことが角度原因と。私は、これらのバインディングをクラスの単純なプロパティを参照するように変更し、その場所に配置されるコードを移動しました。すべてが再び素早く動くようになった!
ありがとうございます!自分の質問に答える
あなたは、問題の原因が何であるかを簡単な言葉で説明できますか?私は問題を読むことから多くを理解することができません... –
おそらくng2とjQueryが混在しているので、ng2 + RxJSだけに頼ってみましたか? http://plnkr.co/edit/LD5FJaI4OOFbKfvhjD4e?p=preview –
これは原因ではありません。申し訳ありませんが、jQueryのすべてのトレースを削除しようとしました。同じ結果。 –