AngularJS file drag and drop in directive

后端 未结 2 505
孤街浪徒
孤街浪徒 2021-01-30 02:58

This example does pretty much what I would like to port in Angular-js: HTML5 File API.

I have been trying to google some example of directives however I found old exampl

相关标签:
2条回答
  • 2021-01-30 03:23

    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>

    0 讨论(0)
  • 2021-01-30 03:28

    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');
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题