0

ajax リクエストを処理し、そこからデータを取得するために使用する小さな関数があります。

すべての JSON が配列に集約されたら、イベントを発生させます。

私の問題は、配列である変数 mySources が処理中に変更されることです。イベントをトリガーする前は、予想どおり、4 つの配列の配列ですが、「リッスン」された後は単なる配列です (配列内の 1 つの配列ではなく、最初の配列のみ)。

 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**
     });

 };
4

1 に答える 1

0

extraParametersに配列を渡す場合$.trigger、配列は「アンボックス化」され、各要素は個別の引数としてイベント ハンドラに渡されます。したがって、イベント ハンドラーは実際に以下を受け取ります。

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

簡単な解決策は、呼び出し時に引数を別の配列にラップすることtriggerです:

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

つまり、4 つの配列の配列の配列である必要があります... JavaScript は楽しいです!

于 2013-07-09T18:53:11.687 に答える