2014-11-07 2 views
2

С помощью dropzone.js для загрузки файла drag'n'drop я хотел бы добавить динамическую загрузку файла.Dropzone.js - Как подключить интерактивную кнопку загрузки (добавить кнопку) динамически

На странице есть список заказов. Когда вы выбираете заказ, он загружается через вызов Ajax и отображается. Я создаю Dropzone на document.body при загрузке страницы, чтобы отказать в загрузке с дружественным сообщением об ошибке до тех пор, пока не будет выбран заказ. Когда заказ загружен, кнопка добавления отображается с порядком, и я хотел бы добавить обработчик кликов Dropzone к этой динамически созданной кнопке. Кнопка будет воссоздана каждый раз, когда выбран новый порядок.

Я просто не могу понять, как установить/изменить clickable Вариант Dropzone после создания Dropzone.

var documentDropzone = new Dropzone(document.body, { 
    url: '/path/to/upload.php', 
    clickable: false, 
    init: function() { 
    this.on('sending', function(file, xhr, formData) { 
     var order_id = parseInt($('#dropzone_order_id').val(), 10); 
     formData.append('order_id', order_id); 
    }); 
    }, 
    accept: function(file, done) { 
    if (parseInt($('#dropzone_order_id').val(), 10)) done(); 
    else { 
     showErrorMessage('Please select an order first'); 
     done('error'); 
    } 
    }, 
    success: function(file, response) { 
    // handle response 
    } 
}); 

$(document).on('click', '.view-opener', function(event) { 
    event.preventDefault(); 
    $('#view-order').remove(); 
    var view = $('<div id="view-order"></div>') 
    .prependTo('#inner-container-top'); 
    view.load(this.href, function(){ 

    // This is the failing line of code. The #dropzone-click-target 
    // is a button that is loaded with this ajax call. 
    // (It also contains a hidden input with #dropzone_order_id 
    // which enables the upload functionality.) 
    Dropzone(document.body, {clickable: '#dropzone-click-target'}); 

    }); 
}); 

скрипку доступна здесь:

http://jsfiddle.net/tomas_eklund/761qr3r5/

+0

Вы пытались настроить 'autoProcessQueue' на false и затем запускать' processQueue' в своем пользовательском обработчике кликов? – elzi

+0

@elzi Я не думаю, что это выполнило бы мои цели. Причина, по которой я создаю Dropzone до того, как выбран заказ, заключается в том, что я хочу изящно обрабатывать ситуации, когда пользователь случайно бросает файл в окно перед выбором заказа. Для многих типов файлов, таких как PDF, он, скорее всего, будет отображаться браузером и заменяет текущий экран, что может быть катастрофическим, если на экране имеется много несохраненных данных. Я не хочу вставлять файлы в очередь и загружать их в следующий выбранный заказ. Я хочу отказаться от загрузки. –

+0

Вижу. Я попытался немного поработать с ним, изменив «myDropzone.options.clickable = true;» после выбора фруктов, но только это не настраивает слушателей событий. Я бы выкрикнул код Dropzones и искал 'if (clickable)', чтобы увидеть, что запускается. Вы могли бы сделать взломанное решение, сначала перезаписав прослушиватель вентиляционных отверстий, затем отвязав его после выбора фрукта. – elzi

ответ

8

Просматривая исходный код dropzone.js я нашел недокументированные destroy() метод. Используя это в сочетании с объектом многоразовых опций, я теперь уничтожаю и воссоздаю Dropzone для каждого загруженного нового заказа.

Так при загрузке страницы я создаю эту Dropzone (что не будет ничего загружать, но отказываются все файлы корректно):

var dropzoneOptions = { clickable: false /* see Question ... */ }; 
var documentDropzone = new Dropzone(document.body, dropzoneOptions); 

Внутри моего «.view-нож» нажмите обработчик, после вызова AJAX, который загружает выбранный заказ, я добавил этот код, который уничтожит предыдущий объект Dropzone, увеличить объект опции и создать новый экземпляр Dropzone:

documentDropzone.destroy(); 
dropzoneOptions.clickable = '#dropzone-click-target'; 
documentDropzone = new Dropzone(document.body, dropzoneOptions); 

Я также обновил JS скрипку: http://jsfiddle.net/tomas_eklund/761qr3r5/39/

+0

Это помогло мне! Благодаря! –

Смежные вопросы