我的javascript变量(数组)在.trigger / .on进程中被修改

时间:2013-07-09 18:40:38

标签: jquery javascript-events

我有一个小函数,用于处理ajax请求并从中获取数据。

一旦我的所有JSON都聚合在一个数组中,我就会发起一个事件。

我的问题是我的变量mySources,一个数组,在进程中被修改。在事件发生之前,正如预期的那样,它是一个包含4个数组的数组,但是在“被监听”之后它只是一个数组(甚至不是数组中的一个数组而只是第一个数组)

 function setSources(){
        var deffereds = [];

        if (arguments.length == 0)
            {
                deffereds.push(getTweets()),
                deffereds.push(getFacebookstatuses()),
                deffereds.push(getCampaigns()),
                deffereds.push(getArticles())
            }
            else
            {
                for (var i = 0; i < arguments.length; i++) {
                    if (arguments[i] == 'tweet'){
                        deffereds.push(getTweets())
                    }
                    else if (arguments[i] == 'facebookstatus'){
                        deffereds.push(getFacebookstatuses())
                    }
                    else if (arguments[i] == 'campaign'){
                        deffereds.push(getCampaigns())
                    }
                    else if (arguments[i] == 'article'){
                        deffereds.push(getArticles())
                    }


                }
            }



            $.when.apply(null,deffereds).done(function(){ 

                var mySources = new Array();
                for (var i = 0; i < arguments.length; i++) {
                  mySources[i]=$.parseJSON(arguments[i][2].responseText).objects; 
                };
                console.log(mySources); **// This gives me an array of 4 arrays as expected**
                $(document).trigger('cal/results',mySources); 
            });

        $(document).on('cal/mySources', function(e,mySources){
            console.dir(mySources); **// This gives me only the first of the 4 arrays**
     });

 };

1 个答案:

答案 0 :(得分:0)

将数组作为extraParameters传递给$.trigger时,数组将被“取消装箱”,并且每个元素都作为单独的参数传递给事件处理程序。因此,您的事件处理程序实际上正在接收:

function(e, mySources0, mySources1, mySources2, ...) { }

一个简单的解决方案是在调用trigger时将参数包装在另一个数组中:

$(document).trigger('cal/results', [mySources]); // Note the extra brackets

所以这应该是一个包含四个数组的数组的数组...... JavaScript很有趣!