无法在Sencha Touch 2上显示嵌套的JSON

时间:2012-09-22 16:04:54

标签: javascript json extjs sencha-touch-2

考虑这个JSON

{
    "stream": {
        "posts": [{
            "post_id": "1",
            "post_type": "text",
            "post_thumb": "bla1",
            "comments": [{
                "comment_id": "7",
                "comment_text": "asd",
            },
            {
                "comment_id": "8",
                "comment_text": "sdf",
            }],
        }],
    }
}

和我的模特

Ext.define('MyAppApp.model.Post', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            'post_id',
            'post_type',
            'post_thumb',
            'comments',
        ],
        proxy: {
            type: 'jsonp',
            url:  'http://MyApp.com/home/index_app',
            reader: {
                type:         'json',
                rootProperty: 'stream'
            }
        }
    }
});

以上正确显示了我视图中的帖子列表。 我添加了一个控制器来推动面板显示每个帖子的完整内容,这是有效的。

控制器

Ext.define('MyAppApp.controller.Main', {
    extend: 'Ext.app.Controller',

    config: {
        refs: {
            stream: 'homepanel'
        },
        control: {
            'homepanel list': {
                itemtap: 'showPost'
            }
        }
    },

    showPost: function(list, index, element, record) {

/////// begin code block that solved my problem

    var data     = record.get('comments');
    var comments = '';

    Ext.Array.each(data, function(item) {
        comments += [item.comment_text] + '<br />';
    });

/////// end 

        this.getStream().push({
            xtype: 'panel',
            html: [
                '<p>' + record.get('post_thumb') + '</p>',
                '<p>' + record.get('comments') + '</p>',
                comments     // added to output HTML
            ].join(''),
            scrollable: true,
            styleHtmlContent: true,
        });
    }
});

我的问题是从comments检索数据,这些数据嵌套在JSON中。

使用上述控制器,我得到了

[object Object],[object Object]

在我的视图和控制台中,我可以打开这些对象并查看我的全部评论。

但是如何在视图中显示它们? (例如,如何显示"comment_text"?)

2 个答案:

答案 0 :(得分:2)

嗯,一旦它们出现在你的模型中,它们就不再是JSON,它们被反序列化为对象。要显示它们,您应该使用 XTemplate 。如果您已在视图中使用模板,则可以直接访问对象的属性以进行渲染。如果有任何事情仍然不清楚,请告诉我。

为什么要将内容自己呈现为html属性?这是性能原因吗?我不习惯ST,所以我问。无论如何,构建一个小辅助函数,它将遍历注释数组并返回或多或少格式化的字符串(这将取决于你,也检查数组至少是一个空的,永远不为null)

var data = record.get('comments')
function(data) {
    var result = '',
        len = data.length,
        i=0;

    for(;i<len;i++) {
        result += data[i]['comment_text'] +'<br />'
    }

    return result;
}

这是origin函数的实现。我发布这个因为不推荐使用Ext.Array.each,因为它为每个元素执行一个函数,并且循环内的函数调用应该不受影响。

showPost: function(list, index, element, record) {
        var data     = record.get('comments');

        function fetchComments(data) {
            var result = '',
                len = data.length,
                i = 0;

            for(;i<len;i++) {
                result += data[i]['comment_text'] + '<br />';
            }

            return result;
        }

        this.getStream().push({
            xtype: 'panel',
            html: [
                '<p>' + record.get('post_thumb') + '</p>',
                '<p>' + fetchComments(data) + '</p>'
            ].join(''),
            scrollable: true,
            styleHtmlContent: true,
        });
    }

答案 1 :(得分:1)

这是我迭代的另一种方式。

Json数据:

{
    "account" : [
        {
            "id": "1",
            "accNo" : "5869785254",
            "curAmt" : "25000",
            "balAmt" : "15000",
            "transdate" : [
                {
                    "date" : "10",
                    "month" : "03",
                    "description" : "Check 232",
                    "crddbt" : "-1200"
                },
                {
                    "date" : "14",
                    "month" : "03",
                    "description" : "ATM Withdrawl",
                    "crddbt" : "-500"
                }
            ],
        }
    ]
}

Sencha Code迭代传输对象。

var transDateObj = record.get('transdate');

Ext.Object.each(transDateObj, function(key, value, myself){

            Ext.Object.each(value, function(key, value, myself){
                console.log(key + ":" + value);
            });
        });