jqGrid JSON Mapping Error - PullRequest
       2

jqGrid JSON Mapping Error

0 голосов
/ 23 марта 2012

При использовании ответов сервера jqGrid и JSON у меня, похоже, возникают проблемы с правильным отображением JSON.

Например, мой ответ сервера выглядит так:мои настройки 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, телефон и агент все отображаются (так как их имена источников данных точно совпадают)Однако название компании, местоположение и последняя загрузка не отображаются.Я подумал, что использование jsonmap вместе с jsonReader: { repeatitems: false} позволило вам иметь разные имена для вашего объекта JSON, чем для вашего colNames объекта.

Вся помощь будет принята с благодарностью.* ОБНОВЛЕНИЕ Извините за позднее обновление.Вот как код будет выглядеть вне тестирования._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();
    }
}

1 Ответ

2 голосов
/ 24 марта 2012

У вас есть еще одна проблема в демо.

  1. Если вы используете datatype: 'local', входные данные из параметра data будут управляться localReader , а не jsonReader. Значение repeatitems из localReader, кстати, уже ложно. Поэтому правильно будет использовать localReader: { id: 'ID' }.
  2. Если вы используете datatype: 'local', опция loadonce: true будет игнорироваться, поскольку данные будут уже локальными и не должны загружаться один раз с сервера.
  3. Если вы используете datatype: 'local', jsonmap будет игнорироваться . Свойство будет использоваться только в случае datatype: 'json' или datatype: 'jsonstring'.
  4. Если вы используете datatype: 'local', значение свойства index должно быть равным как значение свойства name. Только в том случае, если локальная сортировка будет работать правильно.
  5. Вы не должны использовать пробелы ' ' внутри свойства name. Нет метасимволы может быть внутри свойства name.

Таким образом, вы должны использовать name для имени свойства в массиве data:

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, отличное от входных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...