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

Javascript 无法在Sencha Touch 2上显示嵌套JSON,javascript,json,extjs,sencha-touch-2,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",

考虑一下这个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,
        });
    }
});
在我的视图和控制台中,我可以打开这些对象并查看我的全部评论


但是如何在视图中显示它们?(例如,我如何显示
“comment\u text”
?)

好吧,它们一旦在您的模型中就不再是JSON了,它们被反序列化为对象。要显示它们,应使用。如果已在视图中使用模板,则可以直接访问对象的属性以进行渲染。如果还有什么不清楚的地方,请告诉我

为什么要自己将内容呈现到html属性中?这是性能原因吗?我不是那个习惯性的人,所以我问。无论如何,建立一个小的帮助函数,它将在注释数组中循环,并返回或多或少的格式化字符串(这将取决于您,还要检查数组是否至少为空且从不为null)

var data=record.get('comments'))
功能(数据){
var结果=“”,
len=data.length,
i=0;

对于(;i,这里是我迭代的另一种方式

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"
                }
            ],
        }
    ]
}
在transdate对象上迭代的Sencha代码

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

谢谢@sra-但是我应该在我的原始代码中把这个循环放在哪里?我如何在HTML中输出它?虽然我可以循环并将注释发送到控制台,但我无法将此代码放在
HTML:[…]
@torr使用“yourName:function()”在控制器中定义函数,就像您使用showPist()一样并将“var data=…”设置为showPost函数中的第一个。现在您调用它而不是“record.get('comments')@torr I am mobile atm,我可以在大约2小时内为您演示其他一些方法。如果您仍然需要。但我认为这个示例应该可以。thx用于在移动设备上检查…;)…仅供参考,由于意外标记
插入代码时..我们可以稍后再讨论这个问题-我让它工作起来,并在OP-thx中添加了代码,为我指明了正确的方向。我上一次编辑了我的帖子,因为如果可能的话,不要在循环中使用Ext.Array.each甚至任何函数调用。但这更像是一个最佳实践示例。但我觉得有必要提及首先,我使用Sencha Ext.Object.each类在同一个对象上迭代,但它没有,SRA代码给了我一个点击!所以尝试对其每个值使用相同的Ext.Object.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,
        });
    }
{
    "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"
                }
            ],
        }
    ]
}
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);
            });
        });