2013-12-13 2 views
1

Я работаю в интерфейсе страницы, содержащей два 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 
    } 
} 

ответ

0

Я нашел проблему. В запросе сетки PUT сервер возвращал HttpNoContent (204) вместо HttpResponse (200). Я изменил back-end, чтобы вернуть 200 вместо 204, что и сделало трюк.

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