我已经潜伏在Stack Overflow已经很长一段时间了,并且已经找到了很多非常有用的答案。非常感谢社区!我希望能够在不久之后贡献我自己的有用答案。
与此同时,我还有一个我无法弄清楚的问题。我正在使用Sencha Touch创建一个基于Web的手机应用程序,我在使用嵌套循环来迭代一些JSON时遇到了麻烦。我可以获取第一级数据,但不能获取嵌套在第一级中的项。有点related ExtJS thread,但我决定创建自己的,因为ExtJS和Touch以微妙但重要的方式发散。无论如何,这里有一些代码来显示我的位置:
JSON(截断 - JSON是PHP / MYSQL生成的,目前实际上有三个带有“title”的子级别,所有这些都可以访问。这是我无法迭代的子级“项目”):
{
"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
艾瑞克,为什么循环?
如果您的模型以与嵌套JSON相同的方式关联,那么您应该只能在商店中设置autoLoad:true,然后坐下来享受。
无论如何,假设你因为其他一些不相关的原因需要这些数组,问题是你正在尝试。每个
i.data.title.items
当然你应该迭代
i.data.items
此外,如果对象是模型,则可以使用.get()而不是数据对象:
var title = i.get('title);
使用新的sencha touch 2框架,您可以在模型中创建与返回json的方式完全相同的关联。检查Sencha Touch 2 Model Document,它告诉你Model上的各种配置选项。你可以参考ST2 Nested List这个例子。
希望这可以帮助。
“title”不是可枚举的对象,它是一个字符串。要迭代字符串,您需要将其拆分以将其转换为数组。
另外,不要使用Ext.each,而是尝试一个简单的for(var x in obj){}或for(var xc in obj.prop){}如果有效,那么ext.each方法应该也可以,但是如果ext不能迭代它会悄然失败的对象。