Sencha Touch - 通过嵌套循环访问关联模型存储JSON

时间:2011-01-25 16:01:54

标签: json sencha-touch nested-loops

我一直潜伏在Stack Overflow上很长一段时间了,并找到了很多非常有用的答案。非常感谢社区!我希望能够在不久之后贡献我自己的有用答案。

与此同时,我还有另外一个我无法弄清楚的问题。我正在使用Sencha Touch创建一个基于Web的手机应用程序,我在使用嵌套循环来迭代一些JSON时遇到了麻烦。我可以获取第一级数据,但不能获取嵌套在第一级中的项。有点related ExtJS thread,但我决定创建自己的,因为ExtJS和Touch以微妙但重要的方式发散。无论如何,这里有一些代码来显示我的位置:

JSON(截断 - JSON是PHP / MYSQL生成的,目前实际上有三个带有“title”的子级别,所有这些我都可以访问。它是子级别的“items”,通过它我无法迭代):

{
"lists": [
    {
        "title": "Groceries",
        "id": "1",
        "items": [
            {
                "text": "contact solution - COUPON",
                "listId": "1",
                "id": "4",
                "leaf": "true" 
            },
            {
                "text": "Falafel (bulk)",
                "listId": "1",
                "id": "161",
                "leaf": "true" 
            },
            {
                "text": "brita filters",
                "listId": "1",
                "id": "166",
                "leaf": "true" 
            }
        ] 
    } 
]

}

商店:

var storeItms = new Ext.data.Store({
    model: 'Lists',
    proxy: {
        type: 'ajax',
        method: 'post',
        url : LIST_SRC,
        extraParams: {action: 'gtLstItms'},
        reader: {
            type: 'json',
            root: 'lists'
        }
    }
});

工作循环:

storeItms.on('load', function(){
    var lstArr = new Array();
    storeItms.each(function(i) {
        var title = i.data.title;
        lstArr.push(i.data.title);
    });
    console.log(lstArr);
});

非工作嵌套循环:

storeItms.on('load', function(){
    var lstArr = new Array();
    storeItms.each(function(i) {
        var title = i.data.title;
        var id = i.data.id;
        title.items.each(function(l) {
            lstArr.push(l.data.text);
        });
    });
    console.log(lstArr);
});

非工作嵌套循环给出了错误“无法调用方法'每个'未定义”,引用'title.items.each ...'

我怀疑这是因为我没有将title设置为设置键的值:值对,所以它只看到一个字符串列表......但我有点不知所措。

我应该提到商店是通过两个彼此关联的模型填充的。我知道Store可以访问所有内容,因为我可以通过XTemplate进行嵌套迭代。

任何帮助都会受到高度赞赏,并希望能在不久之前以实物形式返回社区!'

-Eric

3 个答案:

答案 0 :(得分:0)

Eric,为什么要循环?

如果您的模型的关联方式与嵌套JSON的方式相同,那么您应该只能在商店中设置autoLoad:true,然后坐下来享受。

无论如何,假设您出于其他一些不相关的原因需要这些数组,问题是您正在尝试.each on

i.data.title.items

当然你应该迭代

i.data.items

此外,如果对象是模型,则可以使用.get()而不是数据对象:

var title = i.get('title);

答案 1 :(得分:0)

使用新的sencha touch 2框架,您可以在模型中创建与返回json的方式完全相同的关联。 检查Sencha Touch 2 Model Document,它会告诉您Model上的各种配置选项。 您可以参考ST2 Nested List的这个示例。

希望这有帮助。

答案 2 :(得分:0)

“title”不是可枚举的对象,它是一个字符串。要迭代字符串,您需要将其拆分以将其转换为数组。

此外,不是使用Ext.each,而是尝试使用简单的for(var x in obj){}或for(var xc in obj.prop){}如果可行,那么ext.each方法也可以正常工作但是如果ext无法迭代它只会悄然失败的对象。