2012-03-23 61 views
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(); 
    } 
} 

回答

2

你在演示中有更多的问题。

  1. 如果使用datatype: 'local'data参数输入数据将由localReader进行管理,而不是jsonReader。 的repeatitems的值是错误的。所以正确的是使用localReader: { id: 'ID' }
  2. 如果使用datatype: 'local',则loadonce: true选项将被忽略,因为数据已经是本地数据,不应该从服务器加载一次。
  3. 如果使用datatype: 'local'jsonmap将被忽略。该物业仅在datatype: 'json'datatype: 'jsonstring'的情况下使用。
  4. 如果使用datatype: 'local'index属性必须为,的值为name属性的值。只有在本地排序将正常工作的情况下。
  5. 您不应该在name属性中使用空格' '。没有meta-characters可以在name属性内。

所以你有data阵列中使用name的属性的名称:

colModel: [ 
    {name: 'ID', index: 'ID', width: 75}, 
    {name: 'Name', index: 'Name', width: 150}, 
    {name: 'Address', index: 'Address', width: 150}, 
    {name: 'Phone', index: 'Phone', width: 125, align: 'center'}, 
    {name: 'Agent', index: 'Agent', width: 150}, 
    {name: 'last_trx', index: 'last_trx', width: 150} 
], 
localReader: { id: 'ID' }, 

我看不出有任何理由为什么你应该需要有其他name财产作为输入数据。

+0

我已经更新了我的帖子,以显示它将如何实际使用。使用这个,不会有实际的'datatype:'local''使用。重新加载网格时,'datatype'将被改为json。我认为'colModel'的'name'选项应该是'colNames'数组中相应的名字吗? – Kyle 2012-03-26 12:26:26

+0

使用你发布的'colModel'确实有效(我也早些时候测试过),但是为什么原版不起作用只是困惑不解。正如我以前的评论所说的,我对colModel的'name'属性和'jsonmap'属性的区别感到困惑。 – Kyle 2012-03-26 12:35:46

+1

@Kyle:我仍然不明白:为什么使用'myAjax'和'datatype:'local''而不是直接从服务器加载'datatype:'json''数据的用法? 'name'选项是该列的自由标识符。在许多情况下,它将用于构造ID。所以它的名字应该对应于id命名规则。它使用命名的属性作为输入,然后在'datatype:'local''的情况下,您应该选择与输入数据相同的'name'属性。如果你使用'datatype:'json'',你可以使用'jsonmap'来描述如何从输入的数据项中获得列的值。 – Oleg 2012-03-26 13:05:25