Есть ли лучший пример для перетаскивания изображения в angularjs или 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>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Договоримся о некоторых шагах:
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>Это могло быть небольшое сложное изменение в образе мыслей. Если что-то непонятно, дайте мне знать.
Не могли бы вы проверить это однажды на скрипке. Потому что теперь я могу загрузить только одно изображение. Нет кнопки плюса, чтобы добавить еще один контент. Пожалуйста, взгляни на это
Пожалуйста, посмотрите мое первое изображение. одна кнопка + с круглым там справа, это кнопка. Когда я щелкаю по нему, оно должно складываться, как второе изображение.
Извините, может плохо. Я нахожусь в середине работы, поэтому я сосредоточен не на 100% :)
Можете ли вы обновить его, когда закончите работу.
Рад помочь :) Удачи!
Привет, @Mosh Feu. Ты прав, чтобы мне помочь. Пожалуйста, помогите мне сделать это ... stackoverflow.com/questions/51360466/…
Большое спасибо за ваш ответ. Есть некоторые важные изменения. Если я перетаскиваю изображение, выходит за рамки коробки. Он должен отображаться внутри поля «Перетащите сюда изображение». И должна появиться кнопка +. Когда я нажимаю кнопку +, должно появиться такое же поле. Это процесс. Пожалуйста, помогите мне это сделать.