Изменить данные в jqGrid на клиенте, а затем отправить пакет на сервер? - PullRequest
2 голосов
/ 30 марта 2012

Я заполняю jqGrid начальными данными. Тогда я пытаюсь сделать так, чтобы пользователь мог редактировать, вставлять и удалять строки. После того, как пользователь закончил, он должен нажать кнопку Сохранить, которая должна отправить измененные данные на сервер для обновления БД.

Я установил сетку на cellubmit: "clientArray" и получаю измененные строки с помощью $ ("# dagbok_grid"). GetChangedCells ('all'). Вроде работает. Когда я добавляю строки, я даю им идентификатор -1, чтобы я знал, какие из них новые.

Когда я пытаюсь реализовать удаление, используя jqGrid ("delGridRow", rowid), кажется, что он всегда хочет отправить сообщение на сервер. Есть ли способ сделать удаление локально, а затем отправить его вместе со всеми другими изменениями?

1 Ответ

0 голосов
/ 30 марта 2012

Чтобы удалить строку из сетки, вы можете использовать delRowData , но использование delGridRow также возможно после некоторых уловок. В ответе я разместил демонстрацию, в которой показано, как реализовать локальное редактирование формы . Основная идея решения - использовать настройку processing: true. Вы можете удалить локальные данные в отношении delGridRow, добавив дополнительные параметры $("#dagbok_grid").jqGrid("delGridRow", rowid, delSettings), где delSettings можно определить следующим образом:

var delSettings = {
        afterShowForm: function ($form) {
            var form = $form.parent()[0], dialog;
            // delete button: "#dData", cancel button: "#eData"
            $("#dData", form).attr("tabindex", "1000");
            $("#eData", form).attr("tabindex", "1001");
            setTimeout(function () {
                // set "Delete" button as default, so one can
                // confirm deliting by pressing "Enter" key
                $("#dData", form).focus();
            }, 50);
            dialog = $form.parent().parent();
            dialog.position({
                my: "center",
                //at: 'center center',
                of: grid.closest('div.ui-jqgrid')
            });
        },
        // because I use "local" data I don't want to send the changes to the server
        // so I use "processing:true" setting and delete the row manually in onclickSubmit
        onclickSubmit: function (options) {
            var gridId = $(options.gbox).attr("id").substr(5),
                gridIdSelector = $.jgrid.jqID(gridId),
                $grid = $("#" + gridIdSelector);
                p = $grid[0].p, // jqGrid parameters
                newPage = p.page,
                rowids = p.multiselect ? p.selarrrow : [p.selrow];

            // reset the value of processing option to true
            // because the value can be changed by jqGrid
            options.processing = true;

            // delete the row
            $.each(rowids, function () {
                $grid.jqGrid('delRowData', this);
            });
            $.jgrid.hideModal("#delmod" + gridIdSelector,
                                { gb: options.gbox,
                                    jqm: options.jqModal,
                                    onClose: options.onClose });

            if (p.lastpage > 1) {// on the multipage grid reload the grid
                if (p.reccount === 0 && newPage === p.lastpage) {
                    // if after deliting there are no rows on the current page
                    // which is the last page of the grid
                    newPage -= 1; // go to the previous page
                }
                // reload grid to make the row from the next page visable.
                $grid.trigger("reloadGrid", [{page: newPage}]);
            }

            return true;
        },
        processing: true
    };

Я бы предупредил вас о проблемах в пакетных модификациях данных, которые вы получаете с сервера. Проблема, с которой вы можете столкнуться, - ошибка одновременности . Другими словами, если два человека редактируют одну и ту же информацию. Пользователь может сначала загрузить информацию и редактировать информацию намного позже, не обновляя сетку с сервера. В то же время другой пользователь может изменить часть информации. Обнаружение таких ошибок не так просто, но еще сложнее создать хорошее сообщение об ошибке. Если пользователю придется внести все модификации еще раз, это очень разозлит пользователя вашей программы. См. здесь и здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...