2012-03-23 4 views
0

jqGrid 및 JSON 서버 응답을 사용할 때 내 JSON 매핑을 올바르게 가져 오는 데 문제가있는 것 같습니다. ,jqGrid JSON 매핑 오류

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, 전화 :

[ 
    {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 설정은이 (테스트에 사용 지역의 데이터 타입 및 지역 데이터 세트)과 같이 :

예를 들어, 내 서버 응답은 다음과 같습니다 및 에이전트가 모두 표시됩니다 (데이터 소스 이름이 정확히 동일 함). 그러나 회사 이름, 위치 및 마지막로드는 모두 표시되지 않습니다. jsonmapjsonReader: { repeatitems: false}과 함께 사용하면 colNames 개체와 JSON 개체에 다른 이름을 사용할 수 있다고 생각했습니다.

모든 도움을 주시면 대단히 감사하겠습니다.

업데이트 늦게 업데이트하여 죄송합니다. 이것이 코드가 테스트에서 어떻게 보이는지입니다. _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. 당신이 data 매개 변수에서 입력 데이터가 localReader에 의해 관리됩니다 datatype: 'local'하지 jsonReader 사용하는 경우. repeatitems의 값이 localReader 인 것은 이미 거짓입니다. 올바른 사용은 localReader: { id: 'ID' }입니다.
  2. datatype: 'local'을 사용하면 데이터가 이미 로컬이므로 서버에서 한 번로드하면 안되기 때문에 loadonce: true 옵션이 무시됩니다.
  3. datatype: 'local'을 사용하는 경우 은 이 아니며이 무시됩니다. 속성은 datatype: 'json' 또는 datatype: 'jsonstring'의 경우에만 사용됩니다. 당신이 datatype: 'local'를 사용하는 경우
  4. index 속성 값은 name 속성의 값과 동일해야합니다. 로컬 정렬의 경우에만 올바르게 작동합니다.
  5. name 속성 안에 ' ' 공백을 사용하면 안됩니다. meta-charactersname 내부에있을 수 있습니다. 당신이 필요로해야하는 이유는 입력 데이터로 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' }, 
    

    :

그래서 당신은 data 배열의 속성의 이름에 name을 사용해야합니다 .

+0

내 게시물을 업데이트하여 실제로 어떻게 사용되는지 알려 드렸습니다. 이것을 사용하면 실제'datatype : 'local'' use는 없을 것입니다. 그리드를 다시로드 할 때'datatype'이 json으로 변경됩니다. 'colModel'의'name' 옵션이'colNames' 배열의 해당 이름이어야한다고 생각하는데 잘못 맞습니까? – Kyle

+0

당신이 게시 한'colModel'을 사용하면 (이전에 잘 테스트 했었 습니다만), 원본이 작동하지 않는 이유에 대해 혼란스러워했습니다. 이전의 코멘트에서 말한 것처럼 colModel의'name' 속성과'jsonmap' 속성의 차이점에 혼란 스럽습니다. – Kyle

+1

@ 카일 : 아직도 이해가 안되는 이유 : 왜'myAjax'와'datatype : 'local''을'datatype :'json''의 사용법을 서버에서 직접로드하는 대신에 사용합니까? 'name' 옵션은 컬럼의 자유로운 식별자입니다. 이것은 많은 경우에 ID를 생성하는 데 사용됩니다. 따라서 그 이름은 id 명명 규칙과 일치해야합니다. named 속성을 입력으로 사용하면'datatype : 'local''의 경우 입력 데이터에서와 동일한'name' 속성을 선택해야합니다. 'datatype : 'json''을 사용하면'jsonmap'을 사용할 수 있습니다. 여기에는 데이터의 입력 항목에서 열의 값을 가져 오는 방법이 나와 있습니다. – Oleg