Một câu hỏi thú vị! +1 từ tôi.
Sự cố với việc sắp xếp các hàng hoặc ô chỉnh sửa bao gồm trong quyền truy cập vào hộp chứa các ô chỉnh sửa. Mã hiện tại của jqGrid không làm điều này và do đó bên trong trình xử lý sự kiện click
trên các tiêu đề cột có kiểm tra xem có bất kỳ đường chỉnh sửa nào trong lưới không. Nếu một số dòng/dòng chỉnh sửa tồn tại thì sắp xếp sẽ bị dừng mà không cần để gọi số onSortCol
gọi lại.
Vì vậy, chỉ có cách thứ hai trong đó một lưu hoặc khôi phục các ô chỉnh sửa trước khi sắp xếp là có thể. Để thực hiện điều này, có một vấn đề nhỏ. Nếu một liên kết bổ sung sự kiện click
trên tiêu đề cột, nó sẽ được gọi là sau trình xử lý tiêu chuẩn ràng buộc trước đó của jqGrid. Vì vậy, người dùng không thể lưu hoặc hủy chỉnh sửa đã thay đổi trước sự kiện nhấp chuột sẽ được xử lý. Người ta có thể khắc phục vấn đề theo hai cách: một trong hai cách có thể gọi hàm sortData
từ trình xử lý sự kiện mới hoặc người ta nên thay đổi thứ tự của các ràng buộc cho sự kiện click
. Mã sau đây minh họa cách tiếp cận thứ hai:
$.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]);
}
}
});
nơi $grid
được định nghĩa là var $grid = $("#list")
. Bạn có thể xem trực tiếp cách hoạt động trên the following demo.
cảm ơn bạn rất nhiều, tôi sẽ thử nó –
hoạt động tuyệt vời. cảm ơn một lần nữa. –
@CatalinFlorea: Bạn được chào đón! – Oleg