Удаление объекта в другой функции - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь выяснить, возможно ли это.Прежде всего, я должен сказать, что я клонирую объект FileReader и поддерживаю его во всем приложении (так что я могу позволить пользователю удалять файлы, прежде чем они официально загрузят их).

Все это работает нормально,но я застрял, пытаясь найти лучший способ позволить пользователю удалить элемент из этого клонированного объекта (элементы такие же, как файлы [изображения в моем случае], которые можно найти в обычном объекте FileReader).

Итак, по сути, я клонировал объект, добавив к нему pseudoHash, который позволяет мне ссылаться на клонированный элемент, который пользователь хочет удалить, и, нажав на значок «Удалить», я ищусвязанный pseudoHash, который я привязал к этому значку, внутри клонированного объекта, и удалите элемент.Если бы объект был в своей собственной функции, он бы работал нормально, но это не так.Поэтому у меня возникли проблемы при попытке удалить членов объекта.Я сделал files глобальным в этом случае, но он все еще не работает.

        // Our FileList object
        files = e.target.files;
        // Create a clone since FileList is readonly
        files = cloneObject(files);
        // If files isn't empty, give the user the option to remove members
        if (files.length) {
            files = removeSelected(files);
        }

Вот моя функция.К сожалению, когда я щелкаю, чтобы удалить изображение из «очереди загрузки», он должен пройти через эту функцию, но на самом деле он не удаляет объект, так как я знаю, что Javascript никогда не удаляет объекты полностью, поэтому, если это последний членЯ пытаюсь установить его на пустой объект, но это не работает.Если это не последний участник, я просто хочу удалить его на свое место.Опять же, поскольку это отдельная функция, а не родительская, она только удаляет локальную ссылку на переменную.

   // Remove selected file from cloned fileList object
    var removeSelected = function(files) {
    var dataPseudoHash = $(this).attr('data-pseudo-hash');

        $('#js-selected-files').delegate('.js-remove-selected', 'click', function() {

            if (files.length == 1) {
                $('.js-image-upload').attr('disabled', true).addClass('btn_disabled');
                files = {};
                delete files;
            } else {
                // Loop through our files object and if we find a member with the same
                // pseudoHash as the attribute from whatever 'X' icon that was clicked, remove it
                $.each(files, function(i, dataPseudoHash) {
                    if (files[i].pseudoHash == dataPseudoHash) {
                        delete files[i];
                        files.length -= 1;
                    }
                });
            }

            // Remove hidden input that prevents duplicate files being uploaded of
            $('.js-pseudo-hash[value="' + dataPseudoHash + '"]').remove();

            $(this).parent().fadeOut('normal', function() {
                $(this).remove();
            });
        return files;
    };

Какой лучший способ справиться с этим?Может быть, установить флаг в true или false, а затем удалить объект или его члены соответственно в родительской функции в зависимости от случая?Не совсем уверен.Кроме этого, у меня все нормально, загрузка файлов, но мне нужно выяснить, как полностью удалить свойства объекта или объекта (если щелкнуть все значки «Удалить»).

1 Ответ

0 голосов
/ 07 марта 2012

Во-первых, вы должны знать, что оператор delete удаляет только элемент массива или элемент объекта, а не весь массив.В вашем первом условии if

if (files.length == 1) {
            $('.js-image-upload').attr('disabled', true).addClass('btn_disabled');
            files = {};
            delete files;
}

Вы удаляете весь объект, который возвращает false.Теперь будет лучше, если вы сможете вручную проверить, является ли второе условие истинным или нет в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...