多维数组和jQuery的getJSON

时间:2009-03-30 21:07:49

标签: javascript jquery json

我向我的应用程序中的控制器提交了一个getJSON请求,该控制器返回带有2个“应用程序”的有效JSON。我知道这个事实,好像我将警告语句移动到jQuery的每个函数中,它会给我预期的结果。

我试图将这些数据存储在一个多维数组中,以便以后与extJS'菜单控件一起使用。

代码:

Ext.onReady(function() {
    var applicationList = [];
    jQuery.getJSON('index.php/applications', function(data) {
        jQuery.each(data.applications, function (i, app) {
            applicationList[i] = [];
            applicationList[i]['text'] = app['title'];
            applicationList[i]['id'] = app['slug'];
        });
    });
    alert(applicationList[0]['text']);

    var applicationMenu = Ext.menu.Menu({
        items: applicationList
    });
});

JSON响应:

{"applications":[{"slug":"test","title":"Test"},{"slug":"hardware","title":"Hardware"}]}

预期结果:

  

测试

实际结果(来自Firebug):

  

applicationList [0]未定义

如果我替换上面的alert(),请使用以下代码获取一个警告窗口,其中包含文本“remove”:

for (p in applicationList) {
    alert(p);
}

现在,我的想法是JSON请求没有及时完成alert()所以我将使用命名回调函数来确保请求已完成:

var data;
jQuery.getJSON('index.php/applications', get_applications(data));

function get_applications(data) {
    jQuery.each(data.applications, function (i, app) {
        applicationList[i] = [];
        applicationList[i]['text'] = app['title'];
        applicationList[i]['id'] = app['slug'];
    });
};

但现在Firebug告诉我data is undefined ......

我觉得自己几乎就在那里,但过去一小时我几乎一直在那里,我觉得好像我现在只是在污染源头试图让它发挥作用。

4 个答案:

答案 0 :(得分:6)

这应该这样做:

Ext.onReady(function() {
    var applicationList = [];
    var applicationMenu;

    jQuery.getJSON('index.php/applications', function(data) {
        jQuery.each(data.applications, function (i, app) {
                applicationList[i] = [];
                applicationList[i]['text'] = app['title'];
                applicationList[i]['id'] = app['slug'];
        });

        applicationMenu = Ext.menu.Menu({
            items: applicationList
        });
    });
});

你的想法是正确的;它不起作用的原因是因为AJAX是一个异步过程,当你触发getJSON函数时,javascript继续运行。您的解决方案不起作用,因为将其作为命名回调并不会改变这样的事实,即在您尝试初始化菜单之前不会触发它。我的所有解决方案都是将菜单启动代码移动到回调中,因为只有这样你才能访问已填写的applicationList。

答案 1 :(得分:3)

你说得对,只有在getJSON回调结束后你才应该使用你的“applicationList”变量。

你应该在jQuery.each()之后调用你的getJSON回调中的Ext.menu.Menu()。

答案 2 :(得分:1)

Paolo Bergantino的解决方案应该可行,但您也可以按照自己的方式使用命名回调函数 - 您只是在代码中犯了一些小错误:

  1. 数据不应该声明为变量 - “function get_applications(data)”中的数据只代表.getJSON返回
  2. .getJSON中的回调函数应该只是函数的名称,没有(data)
  3. 以下是更正后的代码:

    jQuery.getJSON('index.php/applications', get_applications);
    
    function get_applications(data) {
            jQuery.each(data.applications, function (i, app) {
                    applicationList[i] = [];
                    applicationList[i]['text'] = app['title'];
                    applicationList[i]['id'] = app['slug'];
            });
    };
    

答案 3 :(得分:0)

$.getJSON("getq2.php",{yr:year,typ:type},function(data) {

        var items1 = new Array();

            var j=0;
            for ( var i in data ) {
                var items = new Array();

                items.push(data[i][0],Number(data[i][1]));
                items1[j++] = items;
            }
                console.log(items1);
            var plot1 = jQuery.jqplot('chartContainer', [items1],
            {
                seriesDefaults: {

                    // Make this a pie chart.
                    renderer: jQuery.jqplot.PieRenderer,
                    rendererOptions: {
                    startAngle: 180,
                      sliceMargin: 2,
                    dataLabelThreshold: 2,

                        // Put data labels on the pie slices.
                        // By default, labels show the percentage of the slice.
                        showDataLabels: true,

                    }
                },
                grid: {borderWidth:0, shadow:false,background: '#d8d6cb'},
                legend:{placement:'outside',show:true,location:'e',background:'transparent',marginRight:'30px'}       
            });

            });