onDragOver 非常慢 Angular Material 选项卡

onDragOver very slow with Angular Material tabs

我正在使用 Angular 6 和 Angular Material。我正在尝试在 Material 选项卡 () 内实现一个简单的拖放列表。拖放在 material 选项卡外工作正常,但在选项卡内它非常慢(18 秒到 5 项列表中的 DnD 1 项)。即使鼠标没有移动,onDragEvent 也会触发很多次。我试过分离 (onDragStart) 并重新连接 (onDrop) 变化检测器。没什么区别。

这是html:

<div (dragover)="onDragOver($event)">
    <div *ngFor="let item of listItems, let i = index"
         (drop)="onDrop($event, i)"
         [draggable]="true"
         (dragstart)="onDragStart(i)">
        {{item}}
    </div>
</div>

函数如下:

onDragStart(i) {
}


onDragOver(event) {
    console.log('1')
    event.preventDefault();
}

onDrop(event, i) {
}

谢谢。

我遇到了类似的问题,当页面上有很多元素时拖动速度非常慢。我发现删除 (dragover) angular 绑定,并用纯 javascript 替换它立即解决了问题

我换了

(dragover)="this.onDragOver($event)"

ondragover="onDragOver(event)"

您还需要在 index.html 中声明该函数,而不是在您的打字稿文件或 html 模板中(因此是纯 javascript)

似乎当我在屏幕上拖动项目时 - 即使是短暂的,Angular 引擎也过度燃烧并排队等待大量的 onDrop and/or onDragEnter 调用。当 angular 挂钩这些事件时,它还假设 angular 组件中的某些内容发生了变化,并通过变化检测例程运行。

每次……每次。

我解决问题的方法是在拖动开始时关闭变化检测,并在拖动完成后重新打开它。

以下是我所做的简要提示:

  1. 进口ChangeDetectorRef from '@angular/core'
  2. 将 ChangeDetector 注入您的构造函数: constructor(private cdr: ChangeDetectorRef)
  3. 从 dragStart 调用分离: this.cdr.detach();
  4. 从 drop 和 dragEnd 调用 reattach: this.cdr.reattach();

如果您的组件深埋在页面中,您可能必须在更高级别分离更改检测才能看到结果。