jqGrid локальная сортировка данных теряет информацию - PullRequest
1 голос
/ 12 июля 2011

Хорошо, я почти готова рвать на себе волосы. Я загружаю jqGrid с данными JSON, но с параметром loadonce, установленным в true, чтобы он оставался локальным. Когда я просто показываю содержимое столбцов по умолчанию, сортировка работает нормально, но мне нужно, чтобы некоторые столбцы использовали информацию из другого столбца для изменения показанного. Например, вместо столбца «устройство» и «модель» я хочу отобразить оба столбца под одним столбцом, например, «модель - устройство», и для этого я использую специальный форматтер.

Проблема в этом случае, когда я делаю сортировку, я теряю информацию "модели", и она становится "неопределенной". Вот часть моего кода:

mdlTable = tableWrap.jqGrid({
    url: loadURL,
    datatype: 'json',
    colNames: ['ID', 'Device', 'Description', 'IP', 'Model'],
    colModel: [
        {name:'id', index:'id', hidden:true, key:true},
        {name:'device', index:'device', width:192,
            formatter:function(value, options, rData){
                var str = "<a href='/administration/mdl/vwDevice.aspx?device_id=";
                str += rData[0] + "' target='_blank'>" + value;
                if ('' != rData[4]) str += " - " + rData[4];
                str += "</a>";
                return str;
            }
        },
        {name:'desc', index:'desc', width:256, sortable:false},
        {name:'ip', index:'ip', width:96},
        {name:'model', index:'model', hidden:true}
    ],
    sortname: 'id',
    viewrecords: true,
    loadonce: true,
    viewsortcols: [true,'vertical',true],
    gridview: true,
    ignoreCase: true
})
.navGrid('#deviceList_footer', {edit:false, add:false, del:false, cloneToTop:true});

Итак, как вы можете видеть, я скрываю столбец модели и «перемещаю» эту информацию в столбец устройства, потому что именно там он и должен отображаться. При загрузке все нормально, но как только я выполняю сортировку или поиск и обновляю представление, как бы то ни было, «копия» данных по какой-то причине теряется. Если я покажу столбец модели, информация там останется просто отличной, это просто столбец устройства, который получит значение «неопределенное».

Я попытался вызвать "reloadGrid", не помогает. Я также пытался добавить функцию unformat, но я не уверен, что я могу сделать там. Я в основном только что возвратил $ (cellobject) .html () - это явно не сработало.

Редактировать: добавлен пример данных JSON

{ "rows" : [{
        "id" : "181",
        "cell" : ["181", "Router A", "some description", "55.444.33.222", "Model 1"]
    }, {
        "id" : "291",
        "cell" : ["291", "Router B", "some description", "55.333.22.444", "Model 2"]
    }, {
        "id" : "1346",
        "cell" : ["1346", "Router C", "some description", "55.111.44.333", "Model 3"]
    }, {
        "id" : "1999",
        "cell" : ["1999", "Router D", "some description", "55.222.11.000", "Model 4"]
    }
]}

1 Ответ

7 голосов
/ 12 июля 2011

Проблема в том, что вначале третий параметр пользовательского форматера имеет тип массива, а затем не более. Таким образом, вы должны изменить форматер на что-то вроде

formatter: function(value, options, rData){
    var model = '',
        str = "<a href='/administration/mdl/vwDevice.aspx?device_id=" +
              value + "' target='_blank'>" + value;
    if ($.isArray(rData)) {
        model = rData[4];
    } else {
        model = rData.model;
    }
    if (model) {
        str += " - " + model;
    }
    str += "</a>";
    return str;
}

Тогда сортировка будет работать: см. здесь .

Еще один совет. Вы используете key:true свойство столбца id. В случае, если вам не нужно включать одни и те же значения id дважды. Вы можете уменьшить данные JSON до следующих значений

{ "rows" : [
    ["181", "Router A", "some description", "55.444.33.222", "Model 1"],
    ["291", "Router B", "some description", "55.333.22.444", "Model 2"],
    ["1346", "Router C", "some description", "55.111.44.333", "Model 3"],
    ["1999", "Router D", "some description", "55.222.11.000", "Model 4"]
]}

Единственное изменение в jqGrid для возможности чтения нового формата JSON - это дополнительный параметр jsonReader: {cell:''}. Смотрите результаты здесь .

...