Я работаю в интерфейсе страницы, содержащей два jqGrids. Одна из сеток работает отлично, она начинает режим редактирования, когда строка дважды нажата, и выходит из режима редактирования после нажатия клавиши Return
для внесения изменений. Другой (тот, который дает мне проблемы) работает и делает правильный запрос POST при нажатии Return
, но он остается в режиме редактирования.jqGrid не выходит из режима редактирования после сохранения (RESTful API)
Странным является то, что обе сети используют один и тот же код, только изменяя POST
параметры и POST
, PUT
и DELETE
URL. Я считаю, что проблема связана с функцией, которую я использую для преобразования данных POST
в формат JSON: если не все необходимые параметры в этой функции установлены, и поэтому сервер возвращает ошибку при попытке сохранения, сетка выходит из режима редактирования. Но когда все параметры установлены правильно и запрос POST
успешно, сетка остается неизменной. Сетка, которая работает отлично, использует очень похожую функцию для преобразования данных POST в формат JSON.
(отношение) сетевой кодекс в:
function loadCommissions(userid, accountid) {
$("#pager-commissions").empty();
$("#jqgrid-commissions").empty().jqGrid({
url : '/api/v1/commission/?account=' + accountid,
datatype : 'json',
ajaxGridOptions : {
contentType : "application/json"
},
jsonReader : {
repeatitems : false,
id : "id"
},
colNames : ["Commission", "Type", "Rate"],
colModel : [{
name : 'Commission',
width : 202
}, {
name : 'Type',
edittype : 'select',
formatter : 'select',
editoptions : {
value : 'F:Fixed Amount;P:Percentage'
},
stype : 'select'
}, {
name : 'Rate'
}],
cmTemplate : {
editable : true,
width : 100
},
ondblClickRow : function() {
var rowid = $("#jqgrid-commissions").getGridParam('selrow');
$('#jqgrid-commissions').jqGrid('editRow', rowid, {
keys : true,
dataType : 'json',
url : '/api/v1/commission/' + encodeURIComponent(rowid) + '/',
mtype : 'PUT'
});
},
serializeRowData : function(data) {
return serializeCommissionData(data, userid);
},
ajaxRowOptions : {
contentType : "application/json"
},
autowidth : true,
shrinkToFit : false,
gridview : true,
height : "auto",
autoencode : true,
loadonce : false,
rowNum : 10,
rowList : [10, 20, 30],
pager : "#pager-commissions",
viewrecords : true
});
}
Функция для преобразования POST
данных в формате JSON (ожидается на сервере):
function serializeCommissionData(data, userid) {
return JSON.stringify({
user : '/api/v1/user/' + userid + '/',
account : '/api/v1/account/' + $("a.jstree-clicked:first").parent().attr("id") + '/',
Type : data.Type,
Commission : data.Commission,
Rate : data.Rate
});
}
Источник JSON, используемый в сетке (/api/v1/commission/?account=1
) :
{
"rows": [
{
"commission_currency": null,
"account": "/api/v1/account/1/",
"Commission": "Test",
"Rate": "0",
"user": "/api/v1/user/1/",
"Type": "F",
"id": 5,
"resource_uri": "/api/v1/commission/5/"
}
],
"meta": {
"total_count": 1,
"next": null,
"records": 20,
"limit": 20,
"offset": 0,
"total": 1,
"page": 1,
"previous": null
}
}