Angular .nozone 文件上传组件

Angular .nozone file uploader component

我正在 Angular 7 工作,试图创建一个拖放文件上传组件。我让它在下面工作。

public stopPreventAndSetClass(b: boolean, event: any): void {
    if (event.target === this.enterTarget) {
        this.draggedOverTable = b;
    }
    console.log(event.target);
    this.stopAndPrevent(event);
}

public stopAndPrevent($event: any): void {
    event.preventDefault();
    event.stopPropagation();
}
<div class="document-container"
    (drop)="saveFiles($event); stopPreventAndSetClass(false, $event)"
    (dragenter)="enterTarget = $event.target; stopPreventAndSetClass(true, $event)"
    (dragover)="stopAndPrevent($event);"
    (dragleave)="stopPreventAndSetClass(false, $event)"
    [ngClass]="{'showDropContainerBorder': draggedOverTable}">
    <!-- An Angular Material table of uploaded files sits here. So think many child elements. -->
</div>

我的问题是这方面的性能很糟糕(drop 和 saveFiles() 之间的滞后时间约为 4 秒 运行),因为每个 dragover 的变化检测都是 运行 并且dragleave 事件已触发。在进行了大量研究之后,我发现最好的解决方案应该是从 ngzone 中删除 dragover 事件,这将阻止更改检测被触发。来自这里:https://github.com/angular/angular/pull/21681 一个非常简单的方法似乎是 (dragover.nozone)="stopAndPrevent($event)"。这确实解决了性能问题,但它也不再有效,因为浏览器恢复到使用其默认行为(在浏览器中加载文件)而忽略 event.preventDefault();。有谁知道更好的方法或知道如何解决我 运行 遇到的性能问题?

找到解决办法。通过关注 https://github.com/JiaLiPassion/blacklist/blob/master/src/index.html 并添加

将来自 zone.js 的拖拽事件列入黑名单
<script>
    var targets = [window, Document, HTMLBodyElement, HTMLElement];
    __Zone_ignore_on_properties = [];
    targets.forEach(function (target) {
      __Zone_ignore_on_properties.push({
        target: target,
        ignoreProperties: ['dragover']
      });
    });
    __zone_symbol__BLACK_LISTED_EVENTS = ['dragover'];
    __Zone_disable_requestAnimationFrame = true;
</script>

给我的 index.html

您可以使用 lodash-decorators 中的油门。它会阻止装饰函数 运行 比你给它作为参数的毫秒数更频繁。

@Throttle(300) public stopPreventAndSetClass(b: boolean, event: any): void {
   //...
}