如何使用 Sencha Touch 数据模型读取嵌套 JSON 结构?
我整个晚上都在试图解决这个问题,但没有成功。我的 JSON 结构如下(来自另一个系统,因此我无法更改其结构):
{ "parents":{ "parent":[ { "parentId":1, "children":{ "child":[ { "childId":1, }, { "childId":2, } ] } }, { "parentId":2, "children":{ "child":[ { "childId":1, }, { "childId":2, } ] } } ], "pageNum":1, "pageSize":2 } }
但是,我无法弄清楚数据模型的正确结构应该是什么。我已经尝试过以下方法,但它不起作用。顺便说一句,我可以访问家长信息。问题在于访问儿童信息。所以,我猜我设置关系数据的方式有问题。
Ext.regModel("ParentModel", { hasMany: { model: 'ChildrenModel', name: 'children.child' // not too sure about this bit }, fields: [ {name: 'parentId', type: 'string'} ], proxy: { type: 'ajax', url : 'models.json', reader: { type: 'json', root: 'parents.parent' // this works fine } } }); Ext.regModel('ChildrenModel', { belongsTo: 'ParentModel', // not too sure about this bit fields: [{name: 'childId', type: 'string'}] });
使用数据存储:
Ext.regStore('ParentModelStore', { model: 'ParentModel', autoLoad:true });
我正在使用以下模板来获取父信息,但我无法从中获取子数据:
myapp.views.ParentView = Ext.extend(Ext.Panel, { layout: 'card', initComponent: function() { this.list = new Ext.List({ itemTpl: new Ext.XTemplate( '<tpl for=".">', '<div>', '{parentId}', // this works fine '</div>', '<tpl for="children.child">', // this doesn't work {childId} '</tpl>', '</tpl>', ), store: 'ParentStore', }); this.listpanel = new Ext.Panel({ layout: 'fit', items: this.list, }); this.items = this.listpanel; myapp.views.ParentView.superclass.initComponent.apply(this, arguments); }, }); Ext.reg('ParentView', myapp.views.ParentView);
我正在努力解决的问题是“子”和“父”元素分别被另一个元素“子元素”和“父元素”包围。
非常感谢任何帮助。
预先感谢,
Philip
PS 如果我删除外部“children”包装元素并只保留内部“child”元素(并将模型定义中的“children.child”更改为“child”),则代码可以正常工作。
PPS 我正在回答我自己的问题:
Doh!我忘记将“children”元素添加到 ParentModel 的字段中。
它应该如下所示(注意:我不需要指定“hasMany”或“associations”元素 - 不太确定为什么会这样或包含它们的好处是什么):
Ext.regModel("ParentModel", { fields: [ {name: 'parentId', type: 'string'}, {name: 'children'} // VERY IMPORTANT TO ADD THIS FIELD ], proxy: { type: 'ajax', url : 'models.json', reader: { type: 'json', root: 'parents.parent' // this works fine } } }); Ext.regModel('ChildrenModel', { fields: [{name: 'childId', type: 'string'}] });
模板也可以正常工作:
'<tpl for="children.child">', // this syntax works too. {childId} '</tpl>',
I've been trying to figure this out all evening but to no avail. I have a JSON structure as follows (coming from another system so I can't change its structure):
{ "parents":{ "parent":[ { "parentId":1, "children":{ "child":[ { "childId":1, }, { "childId":2, } ] } }, { "parentId":2, "children":{ "child":[ { "childId":1, }, { "childId":2, } ] } } ], "pageNum":1, "pageSize":2 } }
However, I can't figure out what the correct structure for the data models should be. I've tried the following but it does not work. BTW, I can access the parent information. The issue is with accessing the child information. So, I guess there is something wrong with how I've set up the relationship data.
Ext.regModel("ParentModel", { hasMany: { model: 'ChildrenModel', name: 'children.child' // not too sure about this bit }, fields: [ {name: 'parentId', type: 'string'} ], proxy: { type: 'ajax', url : 'models.json', reader: { type: 'json', root: 'parents.parent' // this works fine } } }); Ext.regModel('ChildrenModel', { belongsTo: 'ParentModel', // not too sure about this bit fields: [{name: 'childId', type: 'string'}] });
with a data store:
Ext.regStore('ParentModelStore', { model: 'ParentModel', autoLoad:true });
I'm using the following template which gets me the parent information, but I can't get the child data from it:
myapp.views.ParentView = Ext.extend(Ext.Panel, { layout: 'card', initComponent: function() { this.list = new Ext.List({ itemTpl: new Ext.XTemplate( '<tpl for=".">', '<div>', '{parentId}', // this works fine '</div>', '<tpl for="children.child">', // this doesn't work {childId} '</tpl>', '</tpl>', ), store: 'ParentStore', }); this.listpanel = new Ext.Panel({ layout: 'fit', items: this.list, }); this.items = this.listpanel; myapp.views.ParentView.superclass.initComponent.apply(this, arguments); }, }); Ext.reg('ParentView', myapp.views.ParentView);
What I'm struggling with is the fact that both the "child" and "parent" elements are surrounded by another element, "children" and "parents" respectively.
Any help much appreciated.
Thanks in advance,
Philip
PS If I remove the outer "children" wrapping element and just leave the inner "child" element (and change "children.child" to "child" in the model definition) the code works fine.
PPS I'm answering my own question:
Doh! I forgot to add the "children" element to the ParentModel's fields.
It should be as follows (note: I didn't need to specify the 'hasMany' or 'associations' elements - not too sure why this is or what is the benefit of including them):
Ext.regModel("ParentModel", { fields: [ {name: 'parentId', type: 'string'}, {name: 'children'} // VERY IMPORTANT TO ADD THIS FIELD ], proxy: { type: 'ajax', url : 'models.json', reader: { type: 'json', root: 'parents.parent' // this works fine } } }); Ext.regModel('ChildrenModel', { fields: [{name: 'childId', type: 'string'}] });
The template works fine too:
'<tpl for="children.child">', // this syntax works too. {childId} '</tpl>',
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最近遇到了类似的问题..我想。
您需要指定模型中所需数据的映射。
例如 :
});
使用此 JSON:
},
Ran into a similar problem recently..I think.
You need to specify the mapping to the data you want in your model.
For example :
});
consumes this JSON:
},
我添加了一个转换器,以允许模板一致地访问模型中的数据,无论返回单个对象还是数组。
注意:我实际上不需要定义 ChildrenModel。我想我可以不用定义它,因为 Sencha 必须自动对其进行类型转换。
I've added a converter to allow the template access the data in the model consistently regardless if a single object or an array is returned.
Note: I don't actually need to define the ChildrenModel. I guess I can get away without defining it as Sencha must be automatically type converting it.