编辑:最终解决方案如下。
无论我尝试通过标题拖动还是通过列选择器插件来实现列重新排序,在重新排序列之后,单击任何列标题进行排序都会导致已排序的列被加载到表中的原始位置。使用可排序的方法:
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()中。这样,只有在用户退出页面时才会保存状态。希望这对其他人有帮助。