uploadifySettings不按预期工作

5
我正在使用uploadify,但修改设置的函数似乎无法使用。
我的代码基于以下示例:
#(‘#someID’).uploadifySettings(’scriptData’, {‘name’ : some.val()});

所以这是我正在做的事情:
// INITIALIZATION
$("#"+elementId).uploadify({ 
  // other data
  "scriptData": {
     "token": token
  }
});

稍后我想更新脚本数据:

$("#"+elementId).uploadifySettings("scriptData",{"token": "pleasework"});

...但是这并没有起作用,它仍然使用了初始化期间设置的scriptData。

我做错了什么?


更新:我需要这样做是因为我需要处理令牌。以下是工作流程:

1- Get a token
2- Init uploadify with this token
3- Upload a file
4- Get another token asynchronously
5- Add the token to the already initialized uploadify (bugged)
6- Go to 3

我尝试在初始化时执行以下操作:
"scriptData": {
   "token": $(".token").val()
}

...并在第4步更新.token。

这也不起作用。

更新2:如果我执行以下操作:

"scriptData": {
   "token": getAToken()
}

使用

function getAToken(){
  alert("abcd");
  return "sometoken";
}

我可以看到函数getAToken只被调用了一次(只有一个警告)


你有演示页面可以展示给我们吗?这可能是你脚本的另一部分出了问题。 - nebkat
@neb:不好意思,这是一个未公布项目的管理部分。 :\ - marcgg
@neb:但是除了这个问题,脚本的其余部分都完美运行。 - marcgg
我认为你必须反转这个过程,首先使用uploadifySettings()来获取默认功能,然后再用uploadify()来覆盖它以实现特定目的。 - Luca Filosofi
@balusC:根据uploadify的文档,我在代码中使用双引号。 - marcgg
显示剩余9条评论
4个回答

2
这对我很有帮助,为每个文件上传添加唯一的随机数能够有效实现这一功能。
            function setScriptData(){
                $("#product_attachment").uploadifySettings("scriptData", 
                    {
                      '_fsg_distro_session' : '<%= u cookies["_fsg_distro_session"] %>',
                      'authenticity_token'  : '<%= u form_authenticity_token if protect_against_forgery? %>',
                      'nonce'                               : new Date().getTime() + "<%= @current_user.id %>"                    
                    }
                );
                console.debug($("#product_attachment").uploadifySettings("scriptData"));
            }

            $("#product_attachment").uploadify({
                uploader                    : '/uploadify/uploadify.swf',
                script              : '/products/temp_upload',
                cancelImg           : '/uploadify/cancel.png',
                fileDataName        : 'asset[temp_file]',
                'queueID'           : 'fileQueue',
                onComplete              : function(event, ID, fileObj, response, data){ fileOnCompleteHandler(event,data); },
                onSelect                    : setScriptData,
                auto                : true,
                multi               : false,
                buttonImg           : '/images/attach.png',
                fileNameMaxLength   : 30
            });

我正在使用最新的Uploadify(2.1.0)和JQuery(1.4.1)。


我尝试过了,但没有成功。我正在使用jQuery 1.4.2,但我怀疑它不是问题所在。这周稍后我会抽时间看看你的解决方案。 - marcgg

1

我查看了源代码,发现uploadifySettings()有一个可选的、未记录的(它在这里没有出现)第三个参数。显然,如果你将它设置为true,就像这样:$("#"+elementId).uploadifySettings("scriptData",{"token": "pleasework"}, true);它会覆盖scriptData的现有设置,也许这会产生一些影响。

但基于源代码,我无法确定更改设置会产生什么影响。

    uploadifySettings:function(settingName, settingValue, resetObject) {
        var returnValue = false;
        jQuery(this).each(function() {
            if (settingName == 'scriptData' && settingValue != null) {
                if (resetObject) {
                    var scriptData = settingValue;
                } else {
                    var scriptData = jQuery.extend(settings.scriptData, settingValue);
                }
                var scriptDataString = '';
                for (var name in scriptData) {
                    scriptDataString += '&' + name + '=' + escape(scriptData[name]);
                }
                settingValue = scriptDataString.substr(1);
            }
            returnValue = document.getElementById(jQuery(this).attr('id') + 'Uploader').updateSettings(settingName, settingValue);
        });

那段代码来自版本2.1.0

在初始化之前有没有可能决定设置的方法?

另外,我发现了这个现成的SO问题:Uploadify updateSettings problems


不错的发现,我今天会更深入地研究并在这里更新。 - marcgg
@artlung:我尝试将resetObject设置为true,但它没有改变任何东西。现在在设置之前没有决定设置的方法,因为它们必须更改。 - marcgg
你正在更改哪些设置?哪些值会改变? - artlung
@artlung:为了上传某些东西,我需要传递一个令牌。第一次上传后,该令牌将过期。上传完成后会回调以获取新的令牌,我需要设置uploadify以将此新令牌作为参数传递(这有意义吗?) - marcgg
然后在需要的时候更新它:currentMyToken = function() { return 'X999999'; }; - artlung
显示剩余3条评论

0
尝试在初始化时内联定义函数?例如:
"scriptData": {
   "token": function() { return $("#token").val(); }
}

我不确定为什么这会与您的其他解决方案不同。


如果我尝试这样做,它会尝试将函数作为参数传递,而不是实际执行它。在服务器端,我最终得到了一个相当奇怪的DB调用:SELECT COUNT(*) AS count_id FROM tokens WHERE (tokens.value = 'function () {\n return el.find(".token").val();\n}')。 - marcgg
糟糕!也许Uploadify无法处理那个。很抱歉,你的原始解决方案看起来就像是从Uploadify的文档中直接复制过来的。我想不用说你已经有了最新版本,并且uploadifysettings的调用被正确执行了...有时候我真的很讨厌JavaScript :) - Matt Brunmeier

0

找到解决方案:

我在“onSelect”函数中犯了一个错误。我拼错了元素的ID名称,应该是file_upload,而我输成了fileUpload,这就是为什么它没有更新scriptData参数。我知道这是个愚蠢的错误,但容易发生。下面是整个onSelect函数的代码:

'onSelect' : function(event,data) {
            $("#file_upload").uploadifySettings('scriptData', {'id' : $('#name_of_the_element').val()}
            );
        }

所以请检查一下这是否是问题所在


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接