考虑这个JSON
{
"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,
});
}
});
我的问题是从comments
检索数据,这些数据嵌套在JSON中。
使用上述控制器,我得到了
[object Object],[object Object]
在我的视图和控制台中,我可以打开这些对象并查看我的全部评论。
但是如何在视图中显示它们? (例如,如何显示"comment_text"
?)
答案 0 :(得分:2)
嗯,一旦它们出现在你的模型中,它们就不再是JSON,它们被反序列化为对象。要显示它们,您应该使用 XTemplate 。如果您已在视图中使用模板,则可以直接访问对象的属性以进行渲染。如果有任何事情仍然不清楚,请告诉我。
为什么要将内容自己呈现为html属性?这是性能原因吗?我不习惯ST,所以我问。无论如何,构建一个小辅助函数,它将遍历注释数组并返回或多或少格式化的字符串(这将取决于你,也检查数组至少是一个空的,永远不为null)
var data = record.get('comments')
function(data) {
var result = '',
len = data.length,
i=0;
for(;i<len;i++) {
result += data[i]['comment_text'] +'<br />'
}
return result;
}
这是origin函数的实现。我发布这个因为不推荐使用Ext.Array.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,
});
}
答案 1 :(得分:1)
这是我迭代的另一种方式。
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"
}
],
}
]
}
Sencha Code迭代传输对象。
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);
});
});