Перетащите и загрузите несколько изображений в поле в angular

Есть ли лучший пример для перетаскивания изображения в angularjs или angular любой версии? В angular ничего не нашел.

jsfiddle

У меня есть этот пример, но мое требование состоит в том, чтобы у меня была одна кнопка + в поле. Если я перетащу любое изображение на эту кнопку +, оно должно загрузиться, и рядом с этим полем должно открыться еще одно окно. Пожалуйста, посмотрите изображение.

Перетащите и загрузите несколько изображений в поле в angular

Перетащите и загрузите несколько изображений в поле в angular

Перетащите и загрузите несколько изображений в поле в angular

Вот так мне нужно загрузить больше изображений. Если есть рабочий пример или примеры, пожалуйста, пришлите мне.

// Generated by CoffeeScript 1.6.3
// Couldn't get JSFiddle to work with CoffeeScript as advertised - Link to CoffeeScript Gist: https://gist.github.com/lsiv568/5623361
(function() {
  'use strict';
  angular.module('reusableThings', []).directive('fileDropzone', function() {
    return {
      restrict: 'A',
      scope: {
        file: '=',
        fileName: '='
      },
      link: function(scope, element, attrs) {
        var checkSize, isTypeValid, processDragOverOrEnter, validMimeTypes;
        processDragOverOrEnter = function(event) {
          if (event != null) {
            event.preventDefault();
          }
          event.dataTransfer.effectAllowed = 'copy';
          return false;
        };
        validMimeTypes = attrs.fileDropzone;
        checkSize = function(size) {
          var _ref;
          if (((_ref = attrs.maxFileSize) === (void 0) || _ref === '') || (size / 1024) / 1024 < attrs.maxFileSize) {
            return true;
          } else {
            alert("File must be smaller than " + attrs.maxFileSize + " MB");
            return false;
          }
        };
        isTypeValid = function(type) {
          if ((validMimeTypes === (void 0) || validMimeTypes === '') || validMimeTypes.indexOf(type) > -1) {
            return true;
          } else {
            alert("Invalid file type.  File must be one of following types " + validMimeTypes);
            return false;
          }
        };
        element.bind('dragover', processDragOverOrEnter);
        element.bind('dragenter', processDragOverOrEnter);
        return element.bind('drop', function(event) {
          var file, name, reader, size, type;
          if (event != null) {
            event.preventDefault();
          }
          reader = new FileReader();
          reader.onload = function(evt) {
            if (checkSize(size) && isTypeValid(type)) {
              return scope.$apply(function() {
                scope.file = evt.target.result;
                if (angular.isString(scope.fileName)) {
                  return scope.fileName = name;
                }
              });
            }
          };
          file = event.dataTransfer.files[0];
          name = file.name;
          type = file.type;
          size = file.size;
          reader.readAsDataURL(file);
          return false;
        });
      }
    };
  });

}).call(this);

(function() {
  'use strict';
  angular.module('reusableThings').controller('TestCtrl', function($scope) {
    $scope.image = null
    $scope.imageFileName = ''
  });

}).call(this);
.dropzone {
  width: 250px;
  height: 45px;
  border: 1px solid #ccc;
  text-align: center;
  padding: 30px;
  margin: 20px;
  font-family: Arial;
  position: absolute;
  top: 0;
  left: 0;
}

.image-container {
  width: 312px;
  height: 312px;
  margin: 20px;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 2;
}

.image-container img {
  max-width: 100%;
}

.file-name {
  font-family: Arial;
}
<script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app = "reusableThings" ng-controller = "TestCtrl">
  <div class = "dropzone" file-dropzone = "[image/png, image/jpeg, image/gif]" file = "image" file-name = "imageFileName" data-max-file-size = "3">
    <span>Drop Image Here</span>
  </div>
  <div class = "image-container" ng-show = "image">
    <img ng-src = {{image}} />
    <span class = "file-name">{{imageFileName}}</span>
  </div>
</div>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 310
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Договоримся о некоторых шагах:

  1. Очевидно, что для поддержки нескольких изображений в области действия вам следует сохранить множество изображений.
  2. Мы хотим повторно использовать зону перетаскивания, чтобы после того, как пользователь перетащит в нее изображение, изображение будет рядом с ним, и пользователь сможет перетащить другое изображение. Итак, мы не хотим обрабатывать область видимости, мы проанализируем файл (src и имя) и вызовем обратный вызов onDrop с этими параметрами, а сам элемент управления обработает это.

Пожалуйста, прочтите мой комментарий в коде

// Generated by CoffeeScript 1.6.3
// Couldn't get JSFiddle to work with CoffeeScript as advertised - Link to CoffeeScript Gist: https://gist.github.com/lsiv568/5623361
(function() {
  'use strict';
  angular.module('reusableThings', []).directive('fileDropzone', function() {
    return {
      restrict: 'A',
      scope: {
        // get only a drop callback which will be called with the image object
        image: '='
      },
      link: function(scope, element, attrs) {
        var checkSize, isTypeValid, processDragOverOrEnter, validMimeTypes;
        processDragOverOrEnter = function(event) {
          if (event != null) {
            event.preventDefault();
          }
          event.dataTransfer.effectAllowed = 'copy';
          return false;
        };
        validMimeTypes = attrs.fileDropzone;
        checkSize = function(size) {
          var _ref;
          if (((_ref = attrs.maxFileSize) === (void 0) || _ref === '') || (size / 1024) / 1024 < attrs.maxFileSize) {
            return true;
          } else {
            alert("File must be smaller than " + attrs.maxFileSize + " MB");
            return false;
          }
        };
        isTypeValid = function(type) {
          if ((validMimeTypes === (void 0) || validMimeTypes === '') || validMimeTypes.indexOf(type) > -1) {
            return true;
          } else {
            alert("Invalid file type.  File must be one of following types " + validMimeTypes);
            return false;
          }
        };
        element.bind('dragover', processDragOverOrEnter);
        element.bind('dragenter', processDragOverOrEnter);
        return element.bind('drop', function(event) {
          var file, name, reader, size, type;
          if (event != null) {
            event.preventDefault();
          }
          reader = new FileReader();
          reader.onload = function(evt) {
            if (checkSize(size) && isTypeValid(type)) {
              return scope.$apply(function() {
                // call the callback with the data
                scope.image.image = evt.target.result,
                scope.image.imageFileName = name;
              });
            }
          };
          file = event.dataTransfer.files[0];
          name = file.name;
          type = file.type;
          size = file.size;
          reader.readAsDataURL(file);
          return false;
        });
      }
    };
  });

}).call(this);

(function() {
  'use strict';
  angular.module('reusableThings').controller('TestCtrl', function($scope) {
    // keep in array instead of variables on the scope
    $scope.images = [];
    $scope.drop = (image) => {
//      console.info(image);
      $scope.images.unshift(image);
    }
  });

}).call(this);
.container {
  position: relative;
  width: 312px;
  height: 312px;
  margin: 20px;
}

.dropzone {
  border: 1px solid #ccc;
  text-align: center;
  padding: 30px;
  font-family: Arial;
  position: absolute;
  top: 0;
  left: 0;
  width: 250px;
  height: 45px;
}

.image-container {
  width: 100%;
  height: 100%;
  margin: 20px;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 2;
}

.image-container img {
  max-width: 100%;
}

.file-name {
  font-family: Arial;
}

.button {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  text-align: center;
  border: 1px solid;
  font-size: 25px;
  color: #aaa;
}
<script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app = "reusableThings" ng-controller = "TestCtrl">
  <div class = "container" ng-repeat = "image in images">
    <div ng-if = "!image.image" class = "dropzone" file-dropzone = "[image/png, image/jpeg, image/gif]" image = "image" data-max-file-size = "3">
      <span>Drop Image Here</span>
    </div>
    <div class = "image-container" ng-if = "image.image">
      <img ng-src = {{image.image}} />
      <span class = "file-name">{{image.imageFileName}}</span>
    </div>
  </div>
  <button class = "button" ng-click = "images.push({})">+</button>
</div>

Это могло быть небольшое сложное изменение в образе мыслей. Если что-то непонятно, дайте мне знать.

Большое спасибо за ваш ответ. Есть некоторые важные изменения. Если я перетаскиваю изображение, выходит за рамки коробки. Он должен отображаться внутри поля «Перетащите сюда изображение». И должна появиться кнопка +. Когда я нажимаю кнопку +, должно появиться такое же поле. Это процесс. Пожалуйста, помогите мне это сделать.

sathish kumar 11.06.2018 11:20

Не могли бы вы проверить это однажды на скрипке. Потому что теперь я могу загрузить только одно изображение. Нет кнопки плюса, чтобы добавить еще один контент. Пожалуйста, взгляни на это

sathish kumar 11.06.2018 12:05

Пожалуйста, посмотрите мое первое изображение. одна кнопка + с круглым там справа, это кнопка. Когда я щелкаю по нему, оно должно складываться, как второе изображение.

sathish kumar 11.06.2018 12:11

Извините, может плохо. Я нахожусь в середине работы, поэтому я сосредоточен не на 100% :)

Mosh Feu 11.06.2018 12:16

Можете ли вы обновить его, когда закончите работу.

sathish kumar 11.06.2018 12:18

Рад помочь :) Удачи!

Mosh Feu 11.06.2018 13:30

Привет, @Mosh Feu. Ты прав, чтобы мне помочь. Пожалуйста, помогите мне сделать это ... stackoverflow.com/questions/51360466/…

sathish kumar 16.07.2018 13:53

Другие вопросы по теме