EDIT: окончательное решение приведено ниже.
Независимо от того, пытаюсь ли я реализовать переупорядочивание столбцов с помощью перетаскивания заголовков или с помощью плагина выбора столбцов, после переупорядочения столбцов нажатие на любой заголовок столбца для сортировки приводит к тому, что отсортированные столбцы загружаются в исходные позиции в таблице. Используя метод сортировки:
sortable: {
update: function (perm) {
/*
* code to save the new colmodel goes here
*/
// the following line doesn't seem to do anything... just seems to return an array identical to 'perm'
$("#mainGrid").jqGrid("getGridParam", "remapColumns");
// if included, the next line causes the headers to not move
$("#mainGrid").jqGrid("remapColumns", perm, true);
// this alternate allows them to move, but the newly sorted columns still get remapped to their original position
$("#mainGrid").jqGrid("remapColumns", [0,1,2,3,4,5,6,7,8,9,10,11,12], true);
/* the following allows the headers to move, and allows the sort to occur ONLY
* if the order coming back from the database is unchanged. Note that in my real
* code I create an array of consecutive integers to pass as the first param to
* remapColumns()
*/
$("#mainGrid").jqGrid("remapColumns", [0,1,2,3,4,5,6,7,8,9,10,11,12], true, false);
}
}
Когда страница открывается в первый раз, она создает модель столбца по умолчанию из XML-файла. Когда пользователь меняет порядок заголовков, новая модель столбца и имена столбцов сохраняются в базе данных в виде строк JSON. Когда пользователь делает еще один вызов базы данных, функция считывает новый порядок столбцов из базы данных и создает массив данных с новым порядком.
Проблема, похоже, заключается в том, что после того, как jqGrid переназначил столбцы, он по-прежнему ожидает увидеть данные, возвращаемые с сервера, в исходном порядке. Итак, если исходные данные
[ [A1, B1, C1], [A2, B2, C2], [A3, B3, C3] ]
после переназначения столбцов на порядок C | А | B, jqGrid по-прежнему хочет, чтобы данные возвращались в исходном порядке.
Мое окончательное решение состояло в том, чтобы удалить код, сохраняющий состояние модели столбца, из функции sortable.update() и поместить его в window.onbeforeunload(). Таким образом, состояние сохраняется только тогда, когда пользователь покидает страницу. Надеюсь, это поможет кому-то еще.