интересный вопрос!+1 от меня.
Проблема с сортировкой редактирования строк или ячеек заключается в доступе к содержимому ячеек редактирования.Текущий код jqGrid этого не делает, и поэтому внутри обработчика события click
в заголовках столбцов проверяется, есть ли в сетке какая-либо строка редактирования.Если существует какая-либо строка / строки редактирования, то сортировка будет остановлена без для вызова onSortCol
обратного вызова.
Таким образом, только второй способ, в котором можно сохранить или восстановить ячейки редактирования перед сортировкой,возможный.Для реализации этого есть одна маленькая проблема.Если связать дополнительное событие click
с заголовками столбцов, оно будет называться после предыдущего стандартного обработчика привязки jqGrid.Таким образом, нельзя сохранить или отменить редактирование, измененное до , будет обработано событие щелчка.Решить проблему можно двумя способами: либо можно вызвать функцию sortData
из нового обработчика события, либо изменить порядок привязок на событие click
.Следующий код демонстрирует второй подход:
$.each($grid[0].grid.headers, function () {
var $th = $(this.el), i, l, clickHandler, clickHandlers = [],
currentHandlers = $th.data('events'),
clickBinding = currentHandlers.click;
if ($.isArray(clickBinding)) {
for (i = 0, l = clickBinding.length; i < l; i++) {
clickHandler = clickBinding[i].handler;
clickHandlers.push(clickHandler);
$th.unbind('click', clickHandler);
}
}
$th.click(function () {
var p = $grid[0].p, savedRow = p.savedRow, j, len = savedRow.length;
if (len > 0) {
// there are rows in cell editing or inline editing
if (p.cellEdit) {
// savedRow has the form {id:iRow, ic:iCol, name:nm, v:value}
// we can call restoreCell or saveCell
//$grid.jqGrid("restoreCell", savedRow[0].id, savedRow[0].ic);
$grid.jqGrid("saveCell", savedRow[0].id, savedRow[0].ic);
} else {
// inline editing
for (j = len - 1; j >= 0; j--) {
// call restoreRow or saveRow
//$grid.jqGrid("restoreRow", savedRow[j].id);
$grid.jqGrid("saveRow", savedRow[j].id);
}
}
}
});
l = clickHandlers.length;
if (l > 0) {
for (i = 0; i < l; i++) {
$th.bind('click', clickHandlers[i]);
}
}
});
, где $grid
определены как var $grid = $("#list")
.Вы можете вживую увидеть, как это работает на следующей демонстрации .