如何从angular 2 onDrop事件中获取文件?

Vla*_*mir 10 javascript drag-and-drop image-upload angular

我试过这样但是onDrop当我放弃它时方法不返回图像文件...

onDragStart(event, data: any) {
  event.dataTransfer.setData('data', data);
}
onDrop(event, data: any) {
  let dataTransfer = event.dataTransfer.getData('data');
  event.preventDefault();
}
allowDrop(event) {
  event.preventDefault();
}


<div (drop)="onDrop($event, dropData)" (dragover)="allowDrop($event)"></div>
<div (dragstart)="onDragStart($event, dragData)"></div>
Run Code Online (Sandbox Code Playgroud)

对此有何解决方案?

mar*_*ryl 14

事件onDrop事件仅在onDragOver preventDefault()和stopPropagation()事件上运行方法时触发.

HTML

<div
    (drop)="onDrop($event)"
    (dragover)="onDragOver($event)"
>
    Drop target
</div>
Run Code Online (Sandbox Code Playgroud)

DropComponent.ts

export class DropComponent {
    onDrop(event) {
        event.preventDefault();
    }
    onDragOver(event) {
        event.stopPropagation();
        event.preventDefault();
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

这是必需的,因为默认情况下,浏览器会阻止在放入HTML元素时发生任何事情.在MDN上查看更多信息 - 定义有效的放置区


Shu*_*rma 6

这是在 Angular 2/4/6 中拖放的完整代码:

拖动组件.ts:

import { Component } from '@angular/core';

@Component({
  selector: 'drag-root',
  templateUrl: './drag.component.html',
  styleUrls: ['./drag.component.css']
})
export class AppComponent {

  allowDrop(ev) {
    ev.preventDefault();
  }

  drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
  }

  drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
  }
}
Run Code Online (Sandbox Code Playgroud)

drag.component.html:

<h2>Drag and Drop</h2>
<div  id="div1" 
      (drop)="drop($event)" 
      (dragover)="allowDrop($event)">

      <img 
      src="https://images.pexels.com/photos/658687/pexels-photo-658687.jpeg?auto=compress&cs=tinysrgb&h=350" 
      draggable="true" 
      (dragstart)="drag($event)" 
      id="drag1"
      width="88" 
      height="31">
</div>

<div id="div2" 
  (drop)="drop($event)" 
  (dragover)="allowDrop($event)">
</div>
Run Code Online (Sandbox Code Playgroud)

drag.component.css:

#div1, #div2 {
    float: left;
    width: 100px;
    height: 35px;
    margin: 10px;
    padding: 10px;
    border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)

快照:

拖动 1

拖动 2


小智 6

您可以将 onDrop 功能包装到可重用指令中。像这样:

https://gist.github.com/darrenmothersele/7afda13d858a156ce571510dd78b7624

将此指令应用于元素:

<div (appDropZone)="onDrop($event)"></div>
Run Code Online (Sandbox Code Playgroud)

该事件是使用已删除文件的 JavaScript 数组触发的。因此,您onDrop在组件中的实现如下所示:

onDrop(files: FileList) {
  console.log({ files });
}
Run Code Online (Sandbox Code Playgroud)


Voj*_*ech 0

您可以尝试使用Hostlistener装饰器来处理拖动事件,您可以在 ng2-file-upload 中看到它的实现