Несколько экземпляров FineUploader и динамическое наименование

Я использую FineUploader 4.0.8 в проекте MVC4, используя оболочку jquery. Вот пример моего кода js, который создает один экземпляр FineUploader и работает нормально. В настоящее время мне нужно более одного экземпляра FineUploader, но каждый отдельный элемент управления ничего не знает о другом, и они отображаются на странице по мере необходимости (я видел предыдущие вопросы с использованием jQuery .each , что здесь не сработает). В настоящее время я не могу правильно отобразить какие-либо кнопки загрузки, возможно, из-за дублирования идентификатора или чего-то еще. Ниже показано, как я использую MVC Razor для создания уникальных переменных и идентификаторов html для этого отдельного экземпляра.

Вот моя текущая реализация, в которую я добавил динамические значения (места, где вы видите _@Model.{PropertyName}):

// Uploader control setup
    var [email protected] = $('#[email protected]').fineUploader({
        debug: true,
        template: '[email protected]',
        button: $("#[email protected]"),
        request:
        {
            endpoint: '@Url.Action("UploadFile", "Survey")',
            customHeaders: { Accept: 'application/json' },
            params: {
                [email protected]: (function () { return instance; }),
                [email protected]: (function () { return surveyItemResultId; }),
                [email protected]: (function () { return itemId; }),
                [email protected]: (function () { return loopingCounter++; })
            }
        },
        validation: {
            acceptFiles: ['image/*', 'application/xls', 'application/pdf', 'text/csv', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel'],
            allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'csv', 'xls', 'xlsx', 'pdf', 'xlt', 'xltx', 'txt'],
            sizeLimit: 1024 * 1024 * 2.5, // 2.5MB
            stopOnFirstInvalidFile: false
        },
        failedUploadTextDisplay: {
            mode: 'custom'
        },
        multiple: true,
        text: {
            uploadButton: 'Select your upload file(s)'
        }
    }).on('submitted', function (event, id, filename) {
        $("#modal-overlay").fadeIn();
        $("#modal-box").fadeIn();
        [email protected]++;
        $(':input[type=button], :input[type=submit], :input[type=reset]').attr('disabled', 'disabled');
    }).on('complete', function (event, id, filename, responseJSON) {
        [email protected]++;
        if ([email protected] == [email protected]) {
            $(':input[type=button], :input[type=submit], :input[type=reset]').removeAttr('disabled');
            //$("#overlay").fadeOut();
            $("#modal-box").fadeOut();
            $("#modal-overlay").fadeOut();
        }
    }).on('error', function (event, id, name, errorReason, xhr) {
        //$("#overlay").fadeOut();
        alert('error: ' + errorReason);
        $("#modal-box").fadeOut();
        $("#modal-overlay").fadeOut();
    });
});

Используя тот же принцип, что и выше, я добавил эту логику и в шаблон.

EDIT – добавлен весь шаблон ниже:

 <script type="text/template" id="[email protected]">
    <div class="qq-uploader-selector qq-uploader">
        <div class="qq-upload-drop-area-selector qq-upload-drop-area qq-hide-dropzone">
            <span>Drop files here to upload</span>
        </div>
        <div class="qq-upload-button-selector qq-upload-button">
            <div>Click here to select your upload file(s)</div>
        </div>
        <span class="qq-drop-processing-selector qq-drop-processing">
            <span>Processing dropped files...</span>
            <span class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
        </span>
        <ul class="qq-upload-list-selector qq-upload-list">
            <li>
                <div class="qq-progress-bar-container-selector">
                    <div class="qq-progress-bar-selector qq-progress-bar"></div>
                </div>                   
                <span class="qq-upload-file-selector qq-upload-file"></span>
                <span class="qq-upload-status-text-selector qq-upload-status-text"></span>
            </li>
        </ul>
    </div></script>

Когда я использую приведенный выше код, я вижу только видимую часть перетаскивания, а не кнопку. Ошибок js тоже нет.

У меня есть пример, в котором есть только один экземпляр этого элемента управления, и в результате получается один и тот же видимый раздел перетаскивания и нет кнопки). Любая мысль о том, что происходит? Я с удовольствием обновлю вопрос, если вы обнаружите, что мне не хватает чего-то полезного. Пожалуйста, не ставьте мне -1, если это то, что я могу легко улучшить или исправить.


person RichieMN    schedule 03.06.2014    source источник
comment
Ваш шаблон содержит недопустимый HTML-код (отсутствуют несколько закрывающих тегов). Кроме того, кнопка не указана в вашем шаблоне.   -  person Ray Nicholus    schedule 04.06.2014
comment
Спасибо за внимание, но я сказал, что это только часть шаблона. Я включу все это завтра в редактирование. Спасибо.   -  person RichieMN    schedule 04.06.2014
comment
Пожалуйста, не включайте недопустимый HTML или любой недопустимый код в свой вопрос, когда вы просите объяснить странное поведение.   -  person Ray Nicholus    schedule 04.06.2014
comment
Обновил шаблон, теперь все показывает. Спасибо!   -  person RichieMN    schedule 04.06.2014


Ответы (2)


Если вы не видите кнопку загрузки, значит, в вашем шаблоне нет кнопки с соответствующей пометкой. Похоже, что в шаблоне, который вы предоставили, так и есть. Если ваш фактический шаблон действительно содержит правильно помеченную кнопку загрузки, то ваш шаблон либо неправильно указан в параметре template, либо ваш шаблон неправильно отображается на вашей странице до ваш экземпляр Fine Uploader создан.

person Ray Nicholus    schedule 04.06.2014
comment
Я добавил динамический идентификатор в контейнер DIV кнопки и использовал то же значение в параметре button: кода .fineuploader. Кроме того, я добавил динамическое название кнопки в текст: параметр тоже. Большая проблема заключалась в том, что я включил «qq-hide-dropzone» в кавычки класса. Я увидел это и подумал, что я что-то опечатался. Как только я убедился, что он у вас снаружи, я внес изменения, и он работает, как и ожидалось. Почему это снаружи? - person RichieMN; 04.06.2014

Вот что я сейчас делаю для своей множественной реализации управления загрузкой:

У меня есть несколько div, перечисленных в другом месте, которые содержат текст «Загрузка» (идентификаторы: модальное поле, модальное наложение). Они появляются в зависимости от того, сколько файлов нужно загрузить, и исчезают, когда все они завершены. Не дает пользователю кликать снова и снова, вы знаете, как это бывает...

JS:

var [email protected] = $('#[email protected]').fineUploader({
        debug: true,
        template: '[email protected]',
        button: $("#[email protected]"),
        request:
        {
            endpoint: '@Url.Action("UploadFile", "Survey")',
            customHeaders: { Accept: 'application/json' },
            params: {
                surveyInstanceId: (function () { return [email protected]; }),
                surveyItemResultId: (function () { return [email protected]; }),
                itemId: (function () { return [email protected]; }),
                loopingIndex: (function () { return [email protected]++; })
            }
        },
        validation: {
            acceptFiles: ['image/*', 'application/xls', 'application/pdf', 'text/csv', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel'],
            allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'csv', 'xls', 'xlsx', 'pdf', 'xlt', 'xltx', 'txt'],
            sizeLimit: 1024 * 1024 * 2.5, // 2.5MB
            stopOnFirstInvalidFile: false
        },
        failedUploadTextDisplay: {
            mode: 'custom'
        },
        multiple: true,
        text: {
            [email protected]: 'Select your upload file(s)'
        }
    }).on('submitted', function (event, id, filename) {
        $("#modal-overlay").fadeIn();
        $("#modal-box").fadeIn();
        [email protected]++;
        $(':input[type=button], :input[type=submit], :input[type=reset]').attr('disabled', 'disabled');
    }).on('complete', function (event, id, filename, responseJSON) {
        [email protected]++;
        if ([email protected] == [email protected]) {
            $(':input[type=button], :input[type=submit], :input[type=reset]').removeAttr('disabled');
            //$("#overlay").fadeOut();
            $("#modal-box").fadeOut();
            $("#modal-overlay").fadeOut();
        }
    }).on('error', function (event, id, name, errorReason, xhr) {
        //$("#overlay").fadeOut();
        alert('error: ' + errorReason);
        $("#modal-box").fadeOut();
        $("#modal-overlay").fadeOut();
    });
});

HTML: я добавил динамические идентификаторы к большинству DIV внутри, хотя я не совсем уверен, что это имеет значение. Когда я перетаскиваю, все экземпляры будут отображать область перетаскивания, поскольку наведение изменяет div по классу. Это не имеет большого значения для меня, но ожидайте этого.

 <script type="text/template" id="[email protected]">
    <div id="[email protected]" class="qq-uploader-selector qq-uploader">
        <div id="[email protected]" class="qq-upload-drop-area-selector qq-upload-drop-area" **qq-hide-dropzone**>
            <span>Drop files here to upload</span>
        </div>
        <div id="[email protected]" class="qq-upload-button-selector qq-upload-button">
            <div>Click here to select your upload file(s)</div>
        </div>
        <span id="[email protected]" class="qq-drop-processing-selector qq-drop-processing">
            <span>Processing dropped files...</span>
            <span id="[email protected]" class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
        </span>
        <ul id="[email protected]" class="qq-upload-list-selector qq-upload-list">
            <li>
                <div id="[email protected]" class="qq-progress-bar-container-selector">
                    <div class="qq-progress-bar-selector qq-progress-bar"></div>
                </div>                   
                <span class="qq-upload-file-selector qq-upload-file"></span>
                <span class="qq-upload-status-text-selector qq-upload-status-text"></span>
            </li>
        </ul>
    </div>

person RichieMN    schedule 04.06.2014