JqGrid: сортировка локальных данных

У меня есть некоторые проблемы с локальной сортировкой данных в этом примере. Сортировка не работает, и я не знаю причину этого. Не могли бы вы объяснить проблему в моем коде?

<table id="list" ></table>
<div id="pager"></div>
<script type="text/javascript">
    var myData =  [
                        { id: "1",  cell: ["1", "test"] },
                        { id: "2",  cell: ["2", "test2"] },
                        { id: "3",  cell: ["3", "test3"] },
                        { id: "4",  cell: ["4", "test4"] }
    ];
jQuery("#list").jqGrid({
    data: myData,
    datatype: "local",
    colNames: ['MyId','Client'],
    colModel: [{ name: 'MyId', index: 'MyId', width: 100, align: 'left' ,  sortable: true},
               { name: 'Client', index: 'Client', width: 100, align: 'left', sortable: true }],
    rowNum:10,
    rowList:[10,20,30,100],
    pager: '#pager',
    sortname: 'Id',
    localReader: {repeatitems: true},          
    viewrecords: true,
    sortable: true,
    sortorder: "asc",
    caption: "Tests",
    loadonce: true
});
jQuery("#list").jqGrid('navGrid', '#pager', { edit: false, add: false, del: false });

</script>

PS Сортировка также не работает в этой демонстрации с локальными данными. http://www.ok-soft-gmbh.com/jqGrid/LocalReader.htm

1 ответ

Решение

Вы правы: в jqGrid есть ошибка в использовании datatype: "local" с data параметр в localReader: {repeatitems: true} формат.

Есть много способов исправить ошибку. Один из самых простых кажется мне заменить строки

if(locdata || ts.p.treeGrid===true) {
    rd[locid] = $.jgrid.stripPref(ts.p.idPrefix, idr);
    ts.p.data.push(rd);
    ts.p._index[rd[locid]] = ts.p.data.length-1;
}

со следующим

if(locdata || ts.p.treeGrid===true) {
    rd[locid] = $.jgrid.stripPref(ts.p.idPrefix, idr);
    ts.p.data.push(rd);
    ts.p._index[rd[locid]] = ts.p.data.length-1;
} else if (ts.p.datatype === "local" && dReader.repeatitems) {
    var idStripted = $.jgrid.stripPref(ts.p.idPrefix, idr),
        iData = ts.p._index[idStripted];
    if (iData !== undefined && ts.p.data != null && ts.p.data[iData] != null) {
        $.extend(true, ts.p.data[iData], rd);
    }
}

Демонстрация использует фиксированный код и теперь работает правильно. Позже я опубликую соответствующий запрос на удаление с предлагаемым исправлением для trirand.

ОБНОВЛЕНО: я разместил лучшую реализацию исправления в запросе на извлечение.ОБНОВЛЕНО 2: Мой запрос на получение уже объединен с основным кодом jqGrid на github. Вы можете сделать те же изменения на jquery.jqGrid.srs.jsЗагрузите измененный файл отсюда. В любом случае следующая версия jqGrid (версия выше 4.6.0) будет содержать исправление описанной проблемы.

Другие вопросы по тегам