Я работаю в 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>
Моя проблема в том, что производительность на этом уровне ужасна (~ 4-секундное время задержки между drop и saveFiles () работает), потому что обнаружение изменений выполняется для каждого события dragover
и dragleave
. Проведя большое количество исследований, я обнаружил, что наилучшее решение - удалить событие dragover
из зоны ngzone, что предотвратит срабатывание обнаружения изменений. Отсюда: https://github.com/angular/angular/pull/21681
Очень простой способ сделать это, кажется, (dragover.nozone)="stopAndPrevent($event)"
. Это исправляет проблему производительности, но также больше не работает, поскольку браузер возвращается к использованию по умолчанию (загрузка файла в браузер), игнорируя event.preventDefault();
. Кто-нибудь знает лучший способ сделать это или знает, как исправить проблему с производительностью, с которой я здесь сталкиваюсь?