Reinitialize/Reset 表单提交后的dropzone
Reinitialize/Reset dropzone after form is submitted
我正在使用 dropzone.js 在 rails 上的 ruby 上传图片。这是我的 HTML 代码
<div class="row">
<div class="col-md-12" id="drop-zone-container">
<%= form_tag '/settlement_proofs', method: :post, class: 'dropzone form', id: 'media-dropzone' do %>
<div class="fallback">
<%= file_field_tag 'attachment', multiple: true%>
</div>
<% end %>
</div>
</div>
并且我将 dropzone 初始化为
$("#media-dropzone").dropzone({
acceptedFiles: pg.constants.ACCEPTED_FORMAT,
maxFilesize: pg.constants.ATTACHMENT_MAX_FILE_SIZE, //In MB
maxFiles: pg.constants.ATTACHMENT_MAX_SIZE,
addRemoveLinks: true,
removedfile: function (file) {
if (file.xhr.responseText.length > 0) {
var fileId = JSON.parse(file.xhr.responseText).id;
$.ajax({
url: pg.constants.url.SETTLEMENT_BASE_URL + fileId,
method: 'DELETE',
dataType: "json",
success: function (result) {
$('#uploaded_attachment').val($("#uploaded_attachment").val().replace(result.id + ',', ""));
$('#settlement_proof_status span').fadeOut(0);
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
},
error: function () {
$('#settlement_proof_status').text(I18n.t('attachment_deletion_error')).fadeIn();
}
});
}
},
init: function () {
this.on("success", function (file, message) {
debugger;
appendContent(message.attachment.url, message.id);
});
this.on("error", function (file, message) {
$('#settlement_proof_status span').text(message).fadeIn();
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
});
$('#settlement_invoice_submit_btn').click(function () {
$("#new_settlement_invoice").submit();
});
$('#uploaded_attachment').change(function () {
if (this.value.length == 0) {
this.removeAllFiles();
}
});
}
});
通过 AJAX 提交表单后,我需要将 dropzone 字段重置为默认图像。
this.on("complete", function(file) {
this.removeAllFiles(true);
})
将以上代码写在INIT
函数中。
这将删除 dropzone 中的所有文件并将 dropzone 重置为初始状态。
最后,我自己解决了这个问题。
起初,我从其 parents 中删除了表单 element.It 删除了现有的放置区 instance.Then 我使用 jQuery 创建了表单并再次重新初始化了放置区。
这是我的完整代码
// To reset dropzone before popup load
var resetDropzone = function () {
$('#drop-zone-container').empty();
var $form = makeElement('form', {
action: window.pg.constants.url.SETTLEMENT_BASE_URL,
method: 'post',
id: 'settlement-proof-form',
class: 'dropzone'
});
$('#drop-zone-container').append($form);
var settlmentProofDropZone;
$("#settlement-proof-form").dropzone({
acceptedFiles: pg.constants.ACCEPTED_FORMAT,
maxFilesize: pg.constants.ATTACHMENT_MAX_FILE_SIZE, //In MB
maxFiles: pg.constants.ATTACHMENT_MAX_SIZE,
addRemoveLinks: true,
removedfile: function (file) {
if (file.xhr.responseText.length > 0) {
var fileId = JSON.parse(file.xhr.responseText).id;
$.ajax({
url: pg.constants.url.SETTLEMENT_BASE_URL + fileId,
method: 'DELETE',
dataType: "json",
success: function (result) {
$('#uploaded_attachment').val($("#uploaded_attachment").val().replace(result.id + ',', ""));
$('#settlement_proof_status span').fadeOut(0);
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
},
error: function () {
$('#settlement_proof_status').text(I18n.t('attachment_deletion_error')).fadeIn();
}
});
}
},
init: function () {
settlmentProofDropZone = this;
this.on("success", function (file, message) {
appendContent(message.attachment.url, message.id);
});
}
});
};
function makeElement(element, options) {
var $formField = document.createElement(element);
$.each(options, function (key, value) {
if (key === 'innerHTML') {
$formField.innerHTML = value;
}
else {
$formField.setAttribute(key, value);
}
});
return $formField;
}
});
试试这个:
//DropZone Initiation Section
init: function() {
this.on('success', function(file, json) {
});
this.on('addedfile', function(file) {
});
this.on('drop', function(file) {
});
this.on('removedfile', function(file) {
});
this.on('complete', function(file) {
});
this.on('error', function(file) {
});
this.on('resetFiles', function() {
if(this.files.length != 0){
for(i=0; i<this.files.length; i++){
this.files[i].previewElement.remove();
}
this.files.length = 0;
}
});
}
function JS_ClearDropZone() {
//DropZone Object Get
var objDZ = Dropzone.forElement("div#objDropzone");
//"resetFiles" Event Call
objDZ.emit("resetFiles");
}
这里的每个答案都非常复杂。我在模态中有一个拖放区,其中有一些 ajax 用于在页面上绘制 uploaded/complete 文件。如果用户将另一张图片添加到画廊,我想在不刷新页面的情况下重置该模式中的拖放区。答案?在这里查看我的解决方案
我举了 Senug Nam Kim 和 J Santosh 的例子:
// Where .reset-dz is the class of a button
$('.reset-dz').on('click', function(e){
var myDropzone = Dropzone.forElement("#user-post-submit");
myDropzone.removeAllFiles(true);
});
一个基于脚本的简单解决方案。对于版本 5.4.0
- 将其添加到您的连接脚本中 dropzone.js
$('button#submit_button').click(function () {
$('.dz-preview').empty();
$('.dz-message').show();
});
并在 dropzone.js 添加行 >>> $('.dz-message').hide();
在return_this3.updateTotalUploadProgress()之前; (第 1277 行)
this.on("uploadprogress", function () {
$('.dz-message').hide();
return _this3.updateTotalUploadProgress();
});
这里的每个解决方案都不是针对 React 的,任何人都可以解释我们如何用 React 完成
这是在 react
中上传后删除文件的代码
...
...
const initCallback = (dropzone) => {
myDropzone = dropzone
}
const eventHandlers = {
init: initCallback,
queuecomplete: () => {
if (myDropzone && clearDropzone) {
myDropzone.removeAllFiles()
}
}
}
....
...
我正在使用 dropzone.js 在 rails 上的 ruby 上传图片。这是我的 HTML 代码
<div class="row">
<div class="col-md-12" id="drop-zone-container">
<%= form_tag '/settlement_proofs', method: :post, class: 'dropzone form', id: 'media-dropzone' do %>
<div class="fallback">
<%= file_field_tag 'attachment', multiple: true%>
</div>
<% end %>
</div>
</div>
并且我将 dropzone 初始化为
$("#media-dropzone").dropzone({
acceptedFiles: pg.constants.ACCEPTED_FORMAT,
maxFilesize: pg.constants.ATTACHMENT_MAX_FILE_SIZE, //In MB
maxFiles: pg.constants.ATTACHMENT_MAX_SIZE,
addRemoveLinks: true,
removedfile: function (file) {
if (file.xhr.responseText.length > 0) {
var fileId = JSON.parse(file.xhr.responseText).id;
$.ajax({
url: pg.constants.url.SETTLEMENT_BASE_URL + fileId,
method: 'DELETE',
dataType: "json",
success: function (result) {
$('#uploaded_attachment').val($("#uploaded_attachment").val().replace(result.id + ',', ""));
$('#settlement_proof_status span').fadeOut(0);
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
},
error: function () {
$('#settlement_proof_status').text(I18n.t('attachment_deletion_error')).fadeIn();
}
});
}
},
init: function () {
this.on("success", function (file, message) {
debugger;
appendContent(message.attachment.url, message.id);
});
this.on("error", function (file, message) {
$('#settlement_proof_status span').text(message).fadeIn();
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
});
$('#settlement_invoice_submit_btn').click(function () {
$("#new_settlement_invoice").submit();
});
$('#uploaded_attachment').change(function () {
if (this.value.length == 0) {
this.removeAllFiles();
}
});
}
});
通过 AJAX 提交表单后,我需要将 dropzone 字段重置为默认图像。
this.on("complete", function(file) {
this.removeAllFiles(true);
})
将以上代码写在INIT
函数中。
这将删除 dropzone 中的所有文件并将 dropzone 重置为初始状态。
最后,我自己解决了这个问题。 起初,我从其 parents 中删除了表单 element.It 删除了现有的放置区 instance.Then 我使用 jQuery 创建了表单并再次重新初始化了放置区。 这是我的完整代码
// To reset dropzone before popup load
var resetDropzone = function () {
$('#drop-zone-container').empty();
var $form = makeElement('form', {
action: window.pg.constants.url.SETTLEMENT_BASE_URL,
method: 'post',
id: 'settlement-proof-form',
class: 'dropzone'
});
$('#drop-zone-container').append($form);
var settlmentProofDropZone;
$("#settlement-proof-form").dropzone({
acceptedFiles: pg.constants.ACCEPTED_FORMAT,
maxFilesize: pg.constants.ATTACHMENT_MAX_FILE_SIZE, //In MB
maxFiles: pg.constants.ATTACHMENT_MAX_SIZE,
addRemoveLinks: true,
removedfile: function (file) {
if (file.xhr.responseText.length > 0) {
var fileId = JSON.parse(file.xhr.responseText).id;
$.ajax({
url: pg.constants.url.SETTLEMENT_BASE_URL + fileId,
method: 'DELETE',
dataType: "json",
success: function (result) {
$('#uploaded_attachment').val($("#uploaded_attachment").val().replace(result.id + ',', ""));
$('#settlement_proof_status span').fadeOut(0);
var _ref;
return (_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0;
},
error: function () {
$('#settlement_proof_status').text(I18n.t('attachment_deletion_error')).fadeIn();
}
});
}
},
init: function () {
settlmentProofDropZone = this;
this.on("success", function (file, message) {
appendContent(message.attachment.url, message.id);
});
}
});
};
function makeElement(element, options) {
var $formField = document.createElement(element);
$.each(options, function (key, value) {
if (key === 'innerHTML') {
$formField.innerHTML = value;
}
else {
$formField.setAttribute(key, value);
}
});
return $formField;
}
});
试试这个:
//DropZone Initiation Section
init: function() {
this.on('success', function(file, json) {
});
this.on('addedfile', function(file) {
});
this.on('drop', function(file) {
});
this.on('removedfile', function(file) {
});
this.on('complete', function(file) {
});
this.on('error', function(file) {
});
this.on('resetFiles', function() {
if(this.files.length != 0){
for(i=0; i<this.files.length; i++){
this.files[i].previewElement.remove();
}
this.files.length = 0;
}
});
}
function JS_ClearDropZone() {
//DropZone Object Get
var objDZ = Dropzone.forElement("div#objDropzone");
//"resetFiles" Event Call
objDZ.emit("resetFiles");
}
这里的每个答案都非常复杂。我在模态中有一个拖放区,其中有一些 ajax 用于在页面上绘制 uploaded/complete 文件。如果用户将另一张图片添加到画廊,我想在不刷新页面的情况下重置该模式中的拖放区。答案?在这里查看我的解决方案
我举了 Senug Nam Kim 和 J Santosh 的例子:
// Where .reset-dz is the class of a button
$('.reset-dz').on('click', function(e){
var myDropzone = Dropzone.forElement("#user-post-submit");
myDropzone.removeAllFiles(true);
});
一个基于脚本的简单解决方案。对于版本 5.4.0
- 将其添加到您的连接脚本中 dropzone.js
$('button#submit_button').click(function () { $('.dz-preview').empty(); $('.dz-message').show(); });
并在 dropzone.js 添加行 >>> $('.dz-message').hide();
在return_this3.updateTotalUploadProgress()之前; (第 1277 行)
this.on("uploadprogress", function () { $('.dz-message').hide(); return _this3.updateTotalUploadProgress(); });
这里的每个解决方案都不是针对 React 的,任何人都可以解释我们如何用 React 完成 这是在 react
中上传后删除文件的代码...
...
const initCallback = (dropzone) => {
myDropzone = dropzone
}
const eventHandlers = {
init: initCallback,
queuecomplete: () => {
if (myDropzone && clearDropzone) {
myDropzone.removeAllFiles()
}
}
}
....
...