2015-11-03 3 views
4

У меня есть jqGrid, где я хотел бы проверить данные о ячейке и публиковать только столбцы, данные которых были изменены.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); 
      } 
     }] 
    } 
}], 

В этой сетке, два из моих столбцов для редактирования. Теперь предположим, что если я вношу изменения в один из столбцов любой строки в встроенном редактировании, тогда должно быть опубликовано только значение этой ячейки. Текущая функциональность публикует все ячейки этой конкретной строки. Это возможно?

Я нашел несколько вопросов here и there об этом, но ни один из них не касается этой конкретной проблемы.

В принципе идея, о которой я могу думать, заключается в том, что перед сохранением, если я могу каким-то образом сравнить исходные данные всех редактируемых ячеек этой строки с новым значением перед отправкой, я могу исключить ячейки, данные которых имеют не изменен и только после ячейки, которая изменилась.

Образец сетки: http://jsfiddle.net/dipenshah8/HJema/203/

ответ

3

Я хотел бы предложить вам использовать 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], который содержит строку перед началом редактирования.

ОБНОВЛЕНО: Приведенный выше код должен быть немного сложнее, если данные могут иметь 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/

+0

Привет @Oleg спасибо это прекрасно работает. Один из вопросов, который у меня есть, заключается в том, что в одной из моих других сеток я использую datepicker для редактирования значений datetime этого столбца. Когда я пытаюсь изменить это поле без внесения изменений, и если я попытаюсь его сохранить, он все равно будет отправлен. Это происходит только в случае поля datetime. Я поставил демо [здесь] (http://jsfiddle.net/dipenshah8/HJema/207/), чтобы прояснить мою проблему. Не могли бы вы взглянуть, когда будете свободны? –

+0

@ DipenShah: Добро пожаловать! Я исправил код. См. ** ОБНОВЛЕНО ** часть ответа и модифицированное демо. – Oleg

+0

Спасибо. Это устранило мою проблему. Ты удивительный. –

Смежные вопросы