Javascript 无法在Sencha Touch 2上显示嵌套JSON
考虑一下这个JSONJavascript 无法在Sencha Touch 2上显示嵌套JSON,javascript,json,extjs,sencha-touch-2,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",
{
"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'
}
}
}
});
上面正确地显示了我视图中的帖子列表。
我添加了一个控制器来推动一个面板来显示每个帖子的全部内容,这是有效的
控制器
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,
});
}
});
在我的视图和控制台中,我可以打开这些对象并查看我的全部评论
但是如何在视图中显示它们?(例如,我如何显示
“comment\u text”
?)好吧,它们一旦在您的模型中就不再是JSON了,它们被反序列化为对象。要显示它们,应使用。如果已在视图中使用模板,则可以直接访问对象的属性以进行渲染。如果还有什么不清楚的地方,请告诉我
为什么要自己将内容呈现到html属性中?这是性能原因吗?我不是那个习惯性的人,所以我问。无论如何,建立一个小的帮助函数,它将在注释数组中循环,并返回或多或少的格式化字符串(这将取决于您,还要检查数组是否至少为空且从不为null)
var data=record.get('comments'))
功能(数据){
var结果=“”,
len=data.length,
i=0;
对于(;i,这里是我迭代的另一种方式
Json数据:
{
"account" : [
{
"id": "1",
"accNo" : "5869785254",
"curAmt" : "25000",
"balAmt" : "15000",
"transdate" : [
{
"date" : "10",
"month" : "03",
"description" : "Check 232",
"crddbt" : "-1200"
},
{
"date" : "14",
"month" : "03",
"description" : "ATM Withdrawl",
"crddbt" : "-500"
}
],
}
]
}
在transdate对象上迭代的Sencha代码
var transDateObj = record.get('transdate');
Ext.Object.each(transDateObj, function(key, value, myself){
Ext.Object.each(value, function(key, value, myself){
console.log(key + ":" + value);
});
});
谢谢@sra-但是我应该在我的原始代码中把这个循环放在哪里?我如何在HTML中输出它?虽然我可以循环并将注释发送到控制台,但我无法将此代码放在HTML:[…]
@torr使用“yourName:function()”在控制器中定义函数,就像您使用showPist()一样并将“var data=…”设置为showPost函数中的第一个。现在您调用它而不是“record.get('comments')@torr I am mobile atm,我可以在大约2小时内为您演示其他一些方法。如果您仍然需要。但我认为这个示例应该可以。thx用于在移动设备上检查…;)…仅供参考,由于意外标记(
插入代码时..我们可以稍后再讨论这个问题-我让它工作起来,并在OP-thx中添加了代码,为我指明了正确的方向。我上一次编辑了我的帖子,因为如果可能的话,不要在循环中使用Ext.Array.each甚至任何函数调用。但这更像是一个最佳实践示例。但我觉得有必要提及首先,我使用Sencha Ext.Object.each类在同一个对象上迭代,但它没有,SRA代码给了我一个点击!所以尝试对其每个值使用相同的Ext.Object.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,
});
}
{
"account" : [
{
"id": "1",
"accNo" : "5869785254",
"curAmt" : "25000",
"balAmt" : "15000",
"transdate" : [
{
"date" : "10",
"month" : "03",
"description" : "Check 232",
"crddbt" : "-1200"
},
{
"date" : "14",
"month" : "03",
"description" : "ATM Withdrawl",
"crddbt" : "-500"
}
],
}
]
}
var transDateObj = record.get('transdate');
Ext.Object.each(transDateObj, function(key, value, myself){
Ext.Object.each(value, function(key, value, myself){
console.log(key + ":" + value);
});
});