AngularJS file drag and drop in directive
To consolidate the comments into an answer, change ondrop
to drop
, add e.stopPropagation()
, change holder
to elem
.
edo.directive('fileDrag', function () { return { restrict: 'A', link: function (scope, elem) { elem.bind('drop', function(e){ e.preventDefault(); e..stopPropagation(); var file = e.dataTransfer.files[0], reader = new FileReader(); reader.onload = function (event) { console.log(event.target); elem.style.background = 'url(' + event.target.result + ') no-repeat center'; }; console.log(file); reader.readAsDataURL(file); return false; }); } };});
I was doing something similar and here is my working solution:
HTML
app.directive("dropzone", function() { return { restrict : "A", link: function (scope, elem) { elem.bind('drop', function(evt) { evt.stopPropagation(); evt.preventDefault(); var files = evt.dataTransfer.files; for (var i = 0, f; f = files[i]; i++) { var reader = new FileReader(); reader.readAsArrayBuffer(f); reader.onload = (function(theFile) { return function(e) { var newFile = { name : theFile.name, type : theFile.type, size : theFile.size, lastModifiedDate : theFile.lastModifiedDate } scope.addfile(newFile); }; })(f); } }); } }});
div[dropzone] { border: 2px dashed #bbb; border-radius: 5px; padding: 25px; text-align: center; font: 20pt bold; color: #bbb; margin-bottom: 20px;}
<div dropzone>Drop Files Here</div>
Preventing default events, and getting file from original event. All can be implemented in directive. You should pass function, for work with files to attribute on-file-drop. Also 'dragging' class is added to dropzone element while dragging.In view it looks like this:
<div file-dropzone on-file-drop="myFunction">This is my dropzone </div>
directive:
function fileDropzoneDirective() { return { restrict: 'A', link: fileDropzoneLink }; function fileDropzoneLink($scope, element, attrs) { element.bind('dragover', processDragOverOrEnter); element.bind('dragenter', processDragOverOrEnter); element.bind('dragend', endDragOver); element.bind('dragleave', endDragOver); element.bind('drop', dropHandler); function dropHandler(angularEvent) { var event = angularEvent.originalEvent || angularEvent; var file = event.dataTransfer.files[0]; event.preventDefault(); $scope.$eval(attrs.onFileDrop)(file); } function processDragOverOrEnter(angularEvent) { var event = angularEvent.originalEvent || angularEvent; if (event) { event.preventDefault(); } event.dataTransfer.effectAllowed = 'copy'; element.addClass('dragging'); return false; } function endDragOver() { element.removeClass('dragging'); } }}