2012-04-27 2 views
3

Я не могу найти никаких документов о создании dojox/form/Uploader программно. Я попробовал это самостоятельно, но похоже, что механизм регистрации плагинов как-то сломан.Programmatic Dojox Uploader - ajax upload not working

require([ 
    "dojo/dom-construct", 
    "dijit/form/Button", 
    "dojox/form/Uploader", 
    "dojox/form/uploader/FileList", 
    "dojox/form/uploader/plugins/IFrame", 
    "dojo/domReady!" 
    ], function(domConstruct, Button, Uploader, UploaderFileList) { 

    var form = domConstruct.create('form', { 
     method: 'post', 
     enctype: 'multipart/form-data', 
     class: 'Uploader' 
    }, document.body);  

    var up = new Uploader({ 
     label: 'Pick files', 
     multiple: true, 
     url: '/echo/json/' 
    }).placeAt(form); 

    var list = new UploaderFileList({ 
     uploader: up 
    }).placeAt(form); 

    var btn = new Button({ 
     type: 'submit', 
     label: 'upload', 
     onClick: function() { 
      up.upload(); 
     } 
    }).placeAt(form); 


    btn.startup(); 
    up.startup(); 
    list.startup(); 

});​ 

Пример по jsfiddle here.

Насколько я понимаю, исходный код dojox/form/Uploader и dojox/form/uploader/plugins/IFrame, плагин зарегистрирован через функцию dojox.form.addUploaderPlugin, которая переопределяет класс виджетов Uploader, используя self и подключаемые плагины в качестве своих предшественников. Но ключевой метод «загрузки» виджета Uploader никогда не переопределяется плагином HTML5 (который автоматически включается с плагином iframe).

Это ошибка? Или я делаю что-то неправильно?

Спасибо за помощь!

ответ

3

Вкратце; используйте новый dojox.form.Uploader вместо вытащенной переменной, иначе расширение плагина не применяется.

Причина в том, вы бы увидели, программист делает следующее в addUploaderPlugin:

dojox.form.UploaderOrg = dojox.form.Uploader; 
var extensions = [dojox.form.UploaderOrg]; 
dojox.form.addUploaderPlugin = function(plug){ 

      extensions.push(plug); 
      declare("dojox.form.Uploader", extensions, {}); 
    } 

Класс, который AMD загрузчик возвращает это и будет ВСЕГДА быть dojox.form.UploaderOrg и не знает о расширенных плагинов.

Изменение к следующему:

var up = new dojox.form.Uploader({ 
    label: 'Pick files', 
    multiple: true, 
    url: '/echo/json/' 
}).placeAt(form); 

И убедитесь, что у вас есть не установить djConfig.publishRequireResult = false

+0

Я проснулся сегодня с точно той же идеей :-) спасибо вам большое за ответ! – JoshuaBoshi

+0

Спасибо за это mschr. –