我有一个来自ldap_search()调用的非常嵌套的JSON。我想用这些信息来填充ExtJS ComboBox,但是我遇到了一些与读者有关的麻烦。显然,我无法读取ComboBox中需要的信息,即人员的邮件地址,uid和cn
我认为整个问题在于商店。我正在尝试以下代码:
var store= new Ext.data.JsonStore({
url:'search.php',
root: '',
totalProperty: 'count',
fields: [
{name:'cn', type: 'string', mapping:'cn.0'},
{name:'mail', type: 'string', mapping:'mail.0'},
{name:'uid', type: 'string', mapping:'uid.0'}
]
});
但FireBug告诉我missing ; before statement return obj.cn.0 in ext-all.js (line 7)
。我尝试了另一种更简单的JSON数组并且它可以工作,这就是为什么我真的认为问题在于这部分代码,特别是在映射中。
search.php返回的JSON示例是:
{
"count": 2,
"0": {
"mail": {
"count": 1,
"0": "Mail address not registered."
},
"0": "mail",
"uid": {
"count": 1,
"0": "name0.surname0@domain.com"
},
"1": "uid",
"cn": {
"count": 1,
"0": "Surname0 Name0"
},
"2": "cn",
"count": 3,
"dn": "cn=Surname0 Name0,ou=personal,dc=domain,dc=com"
},
"1": {
"mail": {
"count": 1,
"0": "name1.surname1@domain.com"
},
"0": "mail",
"uid": {
"count": 1,
"0": "name1.surname1"
},
"1": "uid",
"cn": {
"count": 1,
"0": "Surname 1 Name 1"
},
"2": "cn",
"count": 3,
"dn": "cn=Surname1 Name1,ou=personal,dc=domain,dc=com"
}
}
感谢您的时间。
答案 0 :(得分:3)
是的,JSON结构无法直接使用标准的ExtJS JSONReader
。看一下从ExtJS API documentation获取的关于JSON应该如何的示例。
{
results: 2000, // Reader's configured totalProperty
rows: [ // Reader's configured root
// record data objects:
{ id: 1, firstname: 'Bill', occupation: 'Gardener' },
{ id: 2, firstname: 'Ben' , occupation: 'Horticulturalist' },
...
]
}
此外,root
配置选项是必需的,您不能将其留空。在上面的示例中,您的root
将是“行”。
您可能需要首先将您的JSON解析为更简单的格式,然后再将其提供给JSONReader。
答案 1 :(得分:1)
我当时想要做同样的事情,但其中一个嵌套项目是我的图表中的一个字段。这篇文章不断出现,所以我认为看看我做了什么来解决图表问题可能会有所帮助。解决问题的关键是知道标签配置存在:http://docs.sencha.com/ext-js/4-0/#!/api/Ext.chart.Label。使用它可以覆盖传入的默认渲染。在此示例中,字段为“key”(此处未显示,但我的模型使用“key”的默认类型(即,不是字符串))。密钥对象将传递给渲染器。使用函数(t),我现在可以像javascript一样访问该对象,并在对象下传回该名称。
json
key : {
wholePath : "c:/.../fileName.txt",
fileName : "fileName.txt",
}
code:
axes: [
{
title: 'Values',
type: 'Numeric',
position: 'left',
fields: ['value'],
minimum: 0,
maximum: 100,
minorTickSteps: 1
},
{
title: 'File Name',
type: 'Category',
position: 'bottom',
fields: ['key'],
label: {
renderer: function(t) {
var fileName = t.name;
return fileName;
}
}
}