簡體   English   中英

jqgrid - 內聯編輯,僅發布更改的數據

[英]jqgrid - inline editing, post only changed data

我有一個jqGrid,我想檢查單元格數據,只發布數據已更改的列。

考慮這是我的colModel

colModel: [{
    name: 'I_PK',
    index: 'u.I_PK',
    align: 'right',
    editable: false,
    sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'ew', 'nc']
}, {
    name: 'W3LabelSelected',
    index: 'u.W3LabelSelected',
    align: 'center',
    width: 170,
    editable: false,
    edittype: 'checkbox',
    formatter: "checkbox",
    search: false,
    formatoptions: {
        disabled: false
    },
    editoptions: {
        value: "1:0"
    }
}, {
    name: 'I_ItemNumID',
    index: 'u.I_ItemNumID',
    align: 'right',
    editable: true,
    editoptions: {
        dataEvents: [{
            type: 'focusin',
            fn: function (e) {
                var elem = e.target;
                setTimeout(function () {
                    elem.select();
                }, 50);
            }
        }]
    }
}, {
    name: 'Quantity',
    index: 'u.Quantity',
    align: 'right',
    editable: true,
    editoptions: {
        dataEvents: [{
            type: 'focusin',
            fn: function (e) {
                var elem = e.target;
                setTimeout(function () {
                    elem.select();
                }, 50);
            }
        }]
    }
}],

在此網格中,我的兩列可編輯。 現在讓我們說如果我在內聯編輯中的任何一行的列中進行更改,那么只應該發布該單元格的值。 當前功能發布該特定行的所有單元格。 這可能嗎?

我在這里那里發現了一些問題,但似乎都沒有解決這個具體問題。

基本上我能想到的想法是,在保存之前,如果我能夠以某種方式將該行的所有可編輯單元格的原始數據與發布之前的新值進行比較,我可以消除數據未更改的單元格,僅發布已更改的單元格。

示例網格: http//jsfiddle.net/dipenshah8/HJema/203/

我建議你使用serializeSaveData聯編輯或回調serializeRowData舊版本的jqGrid的回調。 回調允許您自定義將發送到服務器的數據。 修改后的演示http://jsfiddle.net/OlegKi/HJema/206/使用以下選項:

inlineEditing: {
    keys: true,
    serializeSaveData: function (postData) {
        var changedData = {}, prop, p = $(this).jqGrid("getGridParam"),
            idname = p.keyName || p.prmNames.id;

        for (prop in postData) {
            if (postData.hasOwnProperty(prop) &&
                (postData[prop] !== p.savedRow[0][prop] || prop === idname)) {
                changedData[prop] = postData[prop];
            }
        }
        alert(JSON.stringify(changedData));
        return changedData;
    }
}

serializeSaveData回調的代碼枚舉默認情況下將發送到服務器的所有屬性,並生成新對象changedData而不是postData 代碼將postData的所有屬性的值與savedRow[0]參數的對應值進行savedRow[0] ,該參數包含開始編輯之前的行。

更新 :如果數據可能有formatter: "date" ,上面的代碼應該有點復雜。 jqGrid在savedRow[0]保存格式化值。 可以將上面的代碼修改為以下代碼:

inlineEditing: {
    keys: true,
    serializeSaveData: function (postData) {
        var changedData = {}, prop, p = $(this).jqGrid("getGridParam"),
            idname = p.keyName || p.prmNames.id,
            oldValue, cm, formatoptions;

        for (prop in postData) {
            oldValue = p.savedRow[0][prop];
            if (p.iColByName[prop] != null) {
                cm = p.colModel[p.iColByName[prop]];
                formatoptions = cm.formatoptions || {};
                if (cm.formatter === "date" && formatoptions.sendFormatted !== true) {
                    oldValue = $.unformat.date.call(this, oldValue, cm);
                }
            }
            if (postData.hasOwnProperty(prop) &&
                    (postData[prop] !== oldValue || prop === idname)) {
                changedData[prop] = postData[prop];
            }
        }
        alert(JSON.stringify(changedData));
        return changedData;
    }
}

查看修改后的演示http://jsfiddle.net/OlegKi/HJema/209/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM