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

标签 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'
            }
        }
    }
});

上面正确地显示了我 View 中的帖子列表。 我添加了一个 Controller 来插入一个面板来显示每个帖子的完整内容,这是有效的。

Controller

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

我的麻烦是从嵌套在 JSON 中的 comments 中检索数据。

使用上面的 Controller ,我得到

[object Object],[object Object]

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

但是如何在 View 中显示它们呢? (例如,如何显示“comment_text”?)

最佳答案

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

为什么要自己将内容渲染到 html 属性中?这是性能原因吗?我不太习惯ST,所以我问一下。无论如何,构建一个小辅助函数,它将循环遍历注释数组并返回或多或少格式化的字符串(这将取决于您,还检查数组是否至少为空且绝不为空)

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

关于javascript - 无法在 Sencha Touch 2 上显示嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545387/

相关文章:

javascript - AngularJS + Angular Strap - 如何根据单击的按钮向模式添加动态内容?

javascript - 在代码中启动 Devbridge 自动完成插件搜索

android - 解析没有键的动态 Json 对象

这是要走的路吗? MySQL 和 Json

css - ExtJS 4 将 CSS 属性添加到操作列

javascript - 如何从外部 url 获取 json 数据并使用句柄模板编译对象列表,然后将其呈现在引导列表中?

javascript - 单击禁用的复选框时如何执行功能?

java - 使用 Jackson 将 Java 对象序列化为 JSON 时抑制包装器对象

javascript - 如何本地化 Ext.LoadMask 的消息?

ExtJS 解析日期错误