0
当使用jqGrid和JSON服务器响应时,我似乎遇到了让我的JSON映射正确的问题。jqGrid JSON映射错误
例如,我的服务器响应如下所示:
[
{ID: 'cmp1', Name: 'Name1', Address: 'Address1', Phone: 'Phone1', Agent: 'Agent1', last_trx: 'last_trx1'},
{ID: 'cmp2', Name: 'Name2', Address: 'Address2', Phone: 'Phone2', Agent: 'Agent2', last_trx: 'last_trx2'}
]
和我的jqGrid的设置是这样的(本地数据类型和本地数据集用于测试):
var grid = $('#grid_id');
grid.jqGrid({
datatype: 'local',
colNames: ['ID', 'Company Name', 'Location', 'Phone', 'Agent', 'Last Load'],
colModel: [
{name: 'ID', index: 'ID', jsonmap: 'ID', width: 75},
{name: 'Company Name', index: 'Name', jsonmap: 'Name', width: 150},
{name: 'Location', index: 'Address', jsonmap: 'Address', width: 150},
{name: 'Phone', index: 'Phone', jsonmap: 'Phone', width: 125, align: 'center'},
{name: 'Agent', index: 'Agent', jsonmap: 'Agent', width: 150},
{name: 'Last Load', index: 'last_trx', jsonmap: 'last_trx', width: 150}
],
loadonce: true,
shrinkToFit: false,
width: 600,
rowNum: 20,
rowList: [10, 20, 30, 40, 50, 100],
repeatitems: false,
jsonReader: { repeatitems: false, id: '0' },
pager: '#companies_pager',
caption: 'Company List',
data: [
{ID: 'cmp1', Name: 'Name1', Address: 'Address1', Phone: 'Phone1', Agent: 'Agent1', last_trx: 'last_trx1'},
{ID: 'cmp2', Name: 'Name2', Address: 'Address2', Phone: 'Phone2', Agent: 'Agent2', last_trx: 'last_trx2'}
]
});
ID,电话,和Agent都显示出来(因为它们的数据源名称完全相同)。但是,公司名称,位置和最后加载都未显示。我认为使用jsonmap
以及jsonReader: { repeatitems: false}
允许您为您的JSON对象使用与您的colNames
对象不同的名称。
所有帮助将不胜感激。
UPDATE 对不起后期更新。这是代码将如何看待测试。 _data.rows是JSON对象的数组。
var noRecords = $('<div>No results for the entered company name.</div>');
grid.jqGrid({
datatype: 'local',
colNames: ['ID', 'Company Name', 'Location', 'Phone', 'Agent', 'Last Load'],
colModel: [
{name: 'ID', jsonmap: 'ID', width: 75},
{name: 'Company Name', jsonmap: 'Name', width: 150},
{name: 'Location', jsonmap: 'Address', width: 150},
{name: 'Phone', jsonmap: 'Phone', width: 125, align: 'center'},
{name: 'Agent', jsonmap: 'Agent', width: 150},
{name: 'Last Load', jsonmap: 'last_trx', width: 150}
],
loadonce: true,
shrinkToFit: false,
width: 600,
rowNum: 20,
rowList: [10, 20, 30, 40, 50, 100],
repeatitems: false,
jsonReader: { repeatitems: false, id: '0' },
pager: '#companies_pager',
caption: 'Company List',
loadComplete: function() {
if(grid[0].p.reccount === 0) {
noRecords.show();
}
else {
noRecords.hide();
}
}
});
/* Get the list of companies based on the search criteria */
function getCompanies() {
var company = document.getElementById('company').value;
if((company != '') && (company != oldCompany)) {
oldCompany = company;
myAjax('get', {method: 'getCompanies', a: 'companies', data: company}, callbackGetCompanies);
}
}
/* Parse the server response */
function callbackGetCompanies(_data) {
if(_data && _data.message) {
if(_data.message == 'true') {
grid.jqGrid('clearGridData').jqGrid('setGridParam', {data: _data.rows, page: 1}).trigger('reloadGrid');
}
else {
dialog(_data.message);
}
}
else {
serverError();
}
}
我已经更新了我的帖子,以显示它将如何实际使用。使用这个,不会有实际的'datatype:'local''使用。重新加载网格时,'datatype'将被改为json。我认为'colModel'的'name'选项应该是'colNames'数组中相应的名字吗? – Kyle 2012-03-26 12:26:26
使用你发布的'colModel'确实有效(我也早些时候测试过),但是为什么原版不起作用只是困惑不解。正如我以前的评论所说的,我对colModel的'name'属性和'jsonmap'属性的区别感到困惑。 – Kyle 2012-03-26 12:35:46
@Kyle:我仍然不明白:为什么使用'myAjax'和'datatype:'local''而不是直接从服务器加载'datatype:'json''数据的用法? 'name'选项是该列的自由标识符。在许多情况下,它将用于构造ID。所以它的名字应该对应于id命名规则。它使用命名的属性作为输入,然后在'datatype:'local''的情况下,您应该选择与输入数据相同的'name'属性。如果你使用'datatype:'json'',你可以使用'jsonmap'来描述如何从输入的数据项中获得列的值。 – Oleg 2012-03-26 13:05:25