В нашем приложении пользователь может редактировать несколько строк одновременно. Когда он нажимает кнопку сохранения, все строки сохраняются в БД, одна за другой.
Проблема, с которой я столкнулся, заключается в том, что когда пользователь заполняет что-то не так, например, пропуская обязательное поле, я хочу отменить сохранение, и пользователь должен иметь возможность исправить ошибку.
В моем решении мне не хватает того, что я не знаю, как отключить строку в режиме редактирования до исходного состояния после успешного сохранения строки. Если я делаю restoreRow, тогда отображаются старые значения перед редактированием.
Мой код (я храню свой jqGrid в переменной с именем grid):
function saveGrid() {
var saveCollection = [];
//Collect all rows in editmode, the rows to be saved.
$.each(grid.getDataIDs(), function (index, id) {
var row = grid.getInd(id, true);
if (row !== false) {
if ($(row).attr('editable') === '1') {
saveCollection.push(id);
}
}
});
//Function to save single row.
function saveSingleRow(rowId) {
var success = false;
grid.saveRow(rowId, function () {
//Row successfully saved.
success = true;
//Here I want to restore the row somehow but not with the old values.
});
//If everything worked out, save next row if there are any left.
if (success) {
saveCollection = $.grep(saveCollection, function (obj) {
return obj !== rowId;
});
if (saveCollection.length > 0) {
return saveSingleRow(saveCollection[0]);
}
}
//If error or the last row, return success status.
return success;
}
//Check if there are any rows in editmode, then begin to save each row.
if (saveCollection.length > 0) {
if (!saveSingleRow(saveCollection[0])) {
//If something went wrong during saving cancel and return from this function.
return;
}
}
//Every row was successfully saved. Reload grid.
grid.trigger('reloadGrid');
}
Как видите, после возникновения ошибки, с сервера или из-за ошибки проверки, процесс сохранения останавливается и возвращает false. Но если это произойдет, скажем, номер строки четыре, то строки с одной по три уже успешно сохранены, но все еще в режиме редактирования. Пользователь будет чувствовать, что эти строки не сохранены.
Вот так я открываю свои строки для редактирования (встроенное редактирование). Это происходит, когда пользователь нажимает кнопку редактирования на панели инструментов:
var rows = $.grep(grid.getGridParam('selarrrow'), function () { return true; });
if (rows !== null && rows.length > 0) {
$.each(rows, function (i1, gr) {
if (gr !== null) {
grid.editRow(gr, false);
}
});
}
Так есть какая-то функция "де-редактирования"? Я не могу придумать лучшего основного решения прямо сейчас. Есть ли способ проверить наличие ошибок проверки перед запуском процесса сохранения? Затем я могу проверить это и после этого отправить все мои строки на сервер и сохранить их в транзакции.
Ценит любую помощь! Спасибо.
ОБНОВЛЕНО
Решение состоит в том, что не существует функции, которая снова блокирует строки после сохранения. Это должно быть сделано автоматически при успешном сохранении. В этом случае проблема заключается в том, что при добавлении функции обратного вызова, которая запускается после того, как сохранение успешно возвращается к клиенту, вы должны вернуть true, чтобы это произошло.
Так вот чего не хватало (утверждение внизу: верните истину;):
grid.saveRow(rowId, function () {
//Row successfully saved.
success = true;
//Here I want to restore the row somehow but not with the old values.
return true;
});