jqGrid: изменения формы сохраняются в строке, но все изменения теряются при переходе назад или вперед

Я использую редактирование формы для локальных данных. Я могу редактировать значения в форме и установить значения обратно в строку (используя setRowData). Но когда я перехожу назад или вперед, изменения теряются.

Как сохранить изменения в строке и исходном источнике в сетке? Позже мне придется перебирать строки, проверять исправления всех ошибок (используя форму редактирования) и публиковать их на сервере.

Код:

var gridId = 'mygrid';
var pagerId = 'mygridpager';

var grid = $('#mygrid');
var pager = $('#mygridpager');

grid.jqGrid({
    caption: caption,
    colModel: getColModel(),
    recreateForm: true,

    hidegrid: true,
    sortorder: 'desc',
    viewrecords: true,
    multiselect: true,
    rownumbers: true,

    autowidth: true,
    height: '100%',
    scrollOffset: 0,

    datatype: 'local',
    data: dataAsArray,
    localReader: {
        repeatitems: true,
        cell: '',
        id: 2
    },

    pager: '#' + pagerId,
    pgbuttons: true,
    rowNum: 5,
    rowList: [2, 5, 7, 10, 250, 500]
});

grid.jqGrid('navGrid',
    '#' + pagerId,
    {
        add: false,
        del: false,
        search: false,

        edit: true,
        edittext: 'Fix Error',
        editicon: 'ui-icon-tag',
        editurl: 'clientArray',

        refreshtext: 'Refresh',
        recreateForm: true
    },
    {
        // edit options
        editCaption: 'Fix Error',
        editurl: 'clientArray',
        recreateForm: true,
        beforeShowForm: function(form) {
            /* Custom style for elements. make it disabled etc */
        },
        onclickSubmit: function(options, postdata) {
                    var idName= $(this).jqGrid('getGridParam').prmNames.id;

                    // [UPDATED]
                    if (postdata[idName] === undefined) {
                        var idInPostdata = this.id + "_id";
                        postdata[idName] = postdata[idInPostdata];
                        postdata['row'] = postdata[idInPostdata];
                    }

            $('#mygrid').jqGrid('setRowData', postdata.row, postdata);

            if (options.closeAfterEdit) {
                $.jgrid.hideModal('#editmod' + gridId, {
                    gb: '#gbox_' + gridId,
                    jqm: options.jqModal,
                    onClose: options.onClose
                });
            }

            options.processing = true;

            return {};
        }
    },
    {}, // add options
    {}, // del options
    {} //search options
).trigger('reloadGrid');

Ваша помощь ценится.

Спасибо

1 ответ

Решение

Я полагаю, что причиной вашей проблемы является использование формата массива (repeatitems: true в localReader) входных данных. Я полагаю, что вам нужно построить массив из postdata и использовать его в качестве параметра setRowData вместо postdata,

Если совет не поможет вам, вы должны опубликовать более полный код сетки с тестовыми данными. Код вроде colModel: getColModel(), не очень помогает Другими словами, вы должны опубликовать достаточно информации, чтобы воспроизвести проблему. Лучшим было бы рабочее демо в http://jsfiddle.net/. Если вы готовите такую ​​демонстрацию, пожалуйста, используйте jquery.jqGrid.src.js вместо jquery.jqGrid.min.js,

ОБНОВЛЕНО: проблема в вашем коде в том, что массивы использования являются элементами, если ввод data (ты используешь repeatitems: true в localReader). Текущая реализация setRowData не поддерживает (работает некорректно) по делу. Например, если у вас есть такие данные изначально

и начать редактирование третьего ряда у вас будет что-то вроде следующего

после использования подобное $('#mygrid').jqGrid('setRowData', postdata.row, postdata); Внутри onclickSubmit, Таким образом, внутренние данные будут неправильно изменены.

Чтобы исправить проблему, я предлагаю перезаписать текущую реализацию setRowData включив следующий код

$.jgrid.extend({
    setRowData : function(rowid, data, cssp) {
        var nm, success=true, title;
        this.each(function(){
            if(!this.grid) {return false;}
            var t = this, vl, ind, cp = typeof cssp, lcdata=t.p.datatype === "local" && t.p.localReader.repeatitems === true? [] : {}, iLocal=0;
            ind = $(this).jqGrid('getGridRowById', rowid);
            if(!ind) { return false; }
            if( data ) {
                try {
                    $(this.p.colModel).each(function(i){
                        nm = this.name;
                        var dval =$.jgrid.getAccessor(data,nm);
                        if( dval !== undefined) {
                            vl = this.formatter && typeof this.formatter === 'string' && this.formatter === 'date' ? $.unformat.date.call(t,dval,this) : dval;
                            if (t.p.datatype === "local" && t.p.localReader.repeatitems === true) {
                                lcdata[iLocal] = vl;
                            } else {
                                lcdata[nm] = vl;
                            }
                            vl = t.formatter( rowid, dval, i, data, 'edit');
                            title = this.title ? {"title":$.jgrid.stripHtml(vl)} : {};
                            if(t.p.treeGrid===true && nm === t.p.ExpandColumn) {
                                $("td[role='gridcell']:eq("+i+") > span:first",ind).html(vl).attr(title);
                            } else {
                                $("td[role='gridcell']:eq("+i+")",ind).html(vl).attr(title);
                            }
                        }
                        if (nm !== "cb" && nm !== "subgrid" && nm !== "rn") {
                            iLocal++;
                        }
                    });
                    if(t.p.datatype === 'local') {
                        var id = $.jgrid.stripPref(t.p.idPrefix, rowid),
                        pos = t.p._index[id], key;
                        if(t.p.treeGrid) {
                            for(key in t.p.treeReader){
                                if(t.p.treeReader.hasOwnProperty(key)) {
                                    delete lcdata[t.p.treeReader[key]];
                                }
                            }
                        }
                        if(pos !== undefined) {
                            t.p.data[pos] = $.extend(true, t.p.data[pos], lcdata);
                        }
                        lcdata = null;
                    }
                } catch (e) {
                    success = false;
                }
            }
            if(success) {
                if(cp === 'string') {$(ind).addClass(cssp);} else if(cssp !== null && cp === 'object') {$(ind).css(cssp);}
                $(t).triggerHandler("jqGridAfterGridComplete");
            }
        });
        return success;
    }
});

Я опубликую свое предложение позже в Trirand. Поэтому можно надеяться, что проблема будет решена в следующей версии jqGrid.

Другие вопросы по тегам