jqGrid, отключенная отредактированная строка - PullRequest
0 голосов
/ 02 августа 2011

В нашем приложении пользователь может редактировать несколько строк одновременно. Когда он нажимает кнопку сохранения, все строки сохраняются в БД, одна за другой.

Проблема, с которой я столкнулся, заключается в том, что когда пользователь заполняет что-то не так, например, пропуская обязательное поле, я хочу отменить сохранение, и пользователь должен иметь возможность исправить ошибку.

В моем решении мне не хватает того, что я не знаю, как отключить строку в режиме редактирования до исходного состояния после успешного сохранения строки. Если я делаю 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;
            });

1 Ответ

1 голос
/ 02 августа 2011

Мне кажется, вам нужно просто добавить класс "not-editable-row" в строку (элемент <tr>) после успешного сохранения изменений. См. ответ для деталей и демонстрации.

ОБНОВЛЕНО на основе обсуждения из комментариев: То, что вы описываете, показывает мне, что сохранение строк некорректно работает в вашей демонстрации. После успешного сохранения saveRow закрывает режим редактирования сохраненной строки. Я создал демо , которое делает то, что вы описываете, но использует только локальное редактирование. В случае сохранения данных на сервере все должно работать точно так же.

В комментарии вы написали, что «сетка заблокирована для редактирования, если другой пользователь в данный момент находится в режиме редактирования на другом компьютере». На мой взгляд, в случае веб-приложения блокировка данных в базе данных является плохой практикой. При разрыве соединения с клиентом или в случае других ошибок вы можете легко заблокировать данные в базе данных, и клиент не будет подключен. Один из них обычно использует оптимистичный контроль параллелизма . Подробнее см. здесь и здесь .

...