我正在试图弄清楚这是否可行。首先,我应该说我正在克隆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,然后根据具体情况在父函数中相应地删除对象或其成员?不太确定。除此之外,我已经让它上传文件了,但我需要找到如何完全删除对象或对象的属性(如果点击所有“删除”图标)。
答案 0 :(得分:0)
首先,您应该知道delete运算符只删除对象的数组或元素,而不是整个数组。在你的第一个if条件
if (files.length == 1) {
$('.js-image-upload').attr('disabled', true).addClass('btn_disabled');
files = {};
delete files;
}
您正在删除返回false的整个对象。 现在,如果你能在任何情况下手动检查第二个if条件是否为真,那将会更好。