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

niwlg2el  于 2022-12-15  发布在  其他
关注(0)|答案(3)|浏览(122)

我已经潜伏在堆栈溢出上相当长的一段时间了,并且已经找到了相当多非常有用的答案。非常感谢社区!我希望能够在不久的将来贡献出我自己有用的答案。
与此同时,我还有一个问题无法解决。我正在使用 Sencha 创建一个基于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...”时,不工作的嵌套循环给我错误“无法调用未定义的方法”each”“
我怀疑这是因为我没有将title设置为键来建立键:值对,所以它只看到一个字符串列表......但我有点不知所措。
我应该提到,存储是通过两个相互关联的模型填充的,我知道存储可以访问所有内容,因为我可以通过XTemplate进行嵌套迭代。
任何帮助都将非常感谢,并希望在不久的将来以同样的方式回报给社区!

  • 埃里克
w8f9ii69

w8f9ii691#

埃里克,为什么要循环?
如果您的模型是以与JSON嵌套相同的方式关联的,那么您应该能够在商店中设置autoLoad:true,坐下来享受吧。
无论如何,假设您需要这些数组是出于其他一些不相关的原因,问题是您正在尝试

i.data.title.items

你当然应该反复

i.data.items

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

var title = i.get('title);
tuwxkamq

tuwxkamq2#

使用新的 Sencha 框架,你可以在模型中创建关联,就像你的json被返回一样。检查SenchaTouch2模型文档,它告诉你模型上的各种配置选项。你可以参考ST2 Nested List的例子。
希望这个有用。

p4tfgftt

p4tfgftt3#

“title”不是一个可枚举对象,它是一个字符串。要迭代一个字符串,你需要将它拆分成一个数组。
此外,不要使用Ext.each,而尝试使用简单的for(var x in obj){}或for(var xc in obj.prop){}如果这样做有效,那么ext.each方法也应该有效,但如果ext不能迭代对象,它就会悄悄地失败。

相关问题