2010-05-14 48 views
14

Tôi đang gặp vấn đề với jqGrid delete mechanism vì nó chỉ gửi các tham số "oper" và "id" dưới dạng dữ liệu POST (id là khóa chính của bảng).jqGrid (Xóa hàng) - Cách gửi dữ liệu POST bổ sung?

Vấn đề là, tôi cần phải xóa một hàng dựa trên id và giá trị cột khác, giả sử user_id. Cách thêm user_id này vào dữ liệu POST?

tôi có thể tóm tắt sự cố như sau:

  1. Làm thế nào để có được những giá trị của ô (user_id) của hàng đã chọn?
  2. VÀ, cách thêm user_id đó vào dữ liệu POST để dữ liệu có thể được truy lục từ mã phía sau nơi quá trình xóa thực tế diễn ra.

mã mẫu:

jQuery("#tags").jqGrid({ 
       url: "subgrid.process.php, 
       editurl: "subgrid.process.php?, 
       datatype: "json", 
       mtype: "POST", 
       colNames:['id','user_id','status_type_id'], 
       colModel:[{name:'id', index:'id', width:100, editable:true}, 

         {name:'user_id', index:'user_id', width:200, editable:true}, 

         {name:'status_type_id', index:'status_type_id', width:200} 
       ], 
       pager: '#pagernav2', 
       rowNum:10, 
       rowList:[10,20,30,40,50,100], 
       sortname: 'id', 
       sortorder: "asc", 
       caption: "Test", 
       height: 200 
     }); 
     jQuery("#tags").jqGrid('navGrid','#pagernav2', 
      {add:true,edit:false,del:true,search:false}, 
     {}, 
      {mtype:"POST",closeAfterAdd:true,reloadAfterSubmit:true}, // add options 
    {mtype:"POST",reloadAfterSubmit:true}, // del options 
      {} // search options 
     ); 

Trả lời

0

tôi đã cùng một vấn đề. Cách mà tôi đã sửa nó, là đặt user_id làm cột đầu tiên trong jsondata của tôi. và với các thiết lập jsonreader của jqgrid bạn có thể thực hiện nó sẽ hoạt động.

http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data

nhìn vào các thiết lập jsonreader cho jsondata.

tôi sử dụng:

jsonReader: { cell: "", id: "0" } 

và dữ liệu của tôi cũng giống như

{ totalpages: "xxx", currpage: "yyy", totalrecords: "zzz", 
    invdata : [ 
    {"userid","cell12", "cell13", "cell14"}, 
    {"userid","cell22", "cell23", "cell24"}, 
    ... 
    ] 
} 

và bây giờ nếu tôi cập nhật một hàng hoặc xóa một hàng tôi sẽ nhận được userid. Hy vọng điều này có thể phù hợp với bạn!

+0

Xin lỗi, nhưng vấn đề không phải là nhận dữ liệu, nhưng trong việc đăng thông tin bổ sung trong khi ** xóa ** của một hàng từ jqGrid. Một nhu cầu không có một userid, nhưng hai id: id và user_id. – Oleg

18

Nó không phải là một vấn đề. Có nhiều cách khác nhau để làm những gì bạn cần. Cách trực tiếp nhất là sử dụng chức năng serializeDelData. Mã của jqGrid mà hàng xóa trông giống như sau

var ajaxOptions = $.extend({ 
    url: rp_ge.url ? rp_ge.url : $($t).jqGrid('getGridParam','editurl'), 
    type: p.mtype, 
    data: $.isFunction(p.serializeDelData) ? p.serializeDelData(postd) : postd, 
    complete:function(data,Status){ 
     //... 
    }, 
    error:function(xhr,st,err){ 
     //... 
    } 
}, $.jgrid.ajaxOptions, p.ajaxDelOptions); 

$.ajax(ajaxOptions); 

Vì vậy, bạn chỉ có thể xác định serializeDelData chức năng riêng của bạn mà làm tất cả những gì bạn cần:

{mtype:"POST", reloadAfterSubmit:true, serializeDelData: function (postdata) { 
     var rowdata = jQuery('#tags').getRowData(postdata.id); 
     // append postdata with any information 
     return {id: postdata.id, oper: postdata.oper, user_id: rowdata.user_id}; 
}}, // del options 

Bằng cách này nếu bạn muốn tạo cho mình những dữ liệu được đăng lên máy chủ, chỉ cần trả về một chuỗi thay vì một đối tượng. Sau đó, dữ liệu sẽ được đăng bởi jQuery.ajax mà không có bất kỳ thay đổi nào.

Nếu bạn muốn đặt thông tin bổ sung không có trong dữ liệu được đăng, nhưng trong URL bạn có thể thực hiện việc này bên trong onclickSubmit. Tôi sử dụng ví dụ một dịch vụ RESTfull ở phía máy chủ và để xóa một mục tôi sử dụng DELETE HTTP request với phần rỗng. Tất cả các tham số được đặt trong URL. Mã tương ứng trông giống như sau:

{mtype:"DELETE", reloadAfterSubmit:true, serializeDelData: function (postdata) { 
     return ""; // the body MUST be empty in DELETE HTTP requests 
}, onclickSubmit: function(rp_ge,postdata) { 
     var rowdata = jQuery('#tags').getRowData(postdata.id); 
     rp_ge.url = 'subgrid.process.php/' + encodeURIComponent(postdata.id) + 
        '?' + jQuery.param ({user_id: rowdata.user_id}); 
}}, // del options 
+0

Cảm ơn. jQuery ('# thẻ'). getRowData (postdata.id); chỉ là những gì tôi đang tìm kiếm. –

+0

Tôi đã thử phương pháp này khi đặt nút xóa trên mỗi hàng trong lưới của tôi - lần đầu tiên bạn nhấp vào xóa, nhưng sau đó mỗi lần xóa tiếp tục sử dụng cùng url như lần nhấp đầu tiên. Tôi đã sửa đổi mã để loại bỏ ghi đè "onclickSubmit" và thay vào đó tôi đã chuyển vào url thích hợp trực tiếp vào phương thức delGridRow (thay vì thiết lập rp_ge.url) và nó hoạt động. –

+0

@ jrnail23: Có lẽ nó phụ thuộc vào cách sử dụng tùy chọn 'recreateForm'. Tôi có 'recreateForm: true' làm cài đặt mặc định của mình. Bạn có thể thử thêm tùy chọn này lại với 'mtype:" DELETE ", reloadAfterSubmit: true, ...'. – Oleg

0

Tôi không chắc chắn làm thế nào để gửi dữ liệu bổ sung, nhưng bạn có thể thử gửi dữ liệu bổ sung như các thông số chuỗi truy vấn như một phần của delete-url.

6

Đây là cách tôi đã jqGrid để nối thêm dữ liệu vào POST trên delete:

var grid = $("#grid").jqGrid(... //make your grid 

$("#grid").jqGrid('navGrid', '#pager', {add:false, edit:false, del:true}, 
        {}, 
        {}, 
        {delData: { 
          name: function() { 
             var sel_id = grid.jqGrid('getGridParam', 'selrow'); 
             var value = grid.jqGrid('getCell', sel_id, 'colName'); 
             return value; 
            } 
          } 
        }, 
        {}, 
        {}); 

này sẽ trả về một bài mảng {id: rowNumber, oper: del, và tên: someValue}. name là cách bạn muốn tham chiếu đến biến của mình trong mảng bài đăng, someValue là bất kỳ nội dung nào trong ô từ hàng đã chọn mà bạn quan tâm.

Hy vọng điều này sẽ hữu ích!

0

Có bạn có thể thêm dữ liệu bổ sung cho POSTDATA sử dụng sự kiện onclickSubmit dưới del thông số của navgrid, Trong trường hợp của bạn nếu bạn muốn gửi user_id bao gồm id, hơn làm một cái gì đó như thế này

$("#gridId").jqGrid({ 
    }).hideCol(['']).navGrid('#pagerId', { 
     edit: false, add: false, del: true, search: true, refresh: true, beforeRefresh: function() { 
     }, afterRefresh: function() { 
     } 
    }, {}, {}, { 
     afterComplete: function() { 
     }, onclickSubmit: function (params) { 
      var extraParameters = []; var arraySelected = $("#gridId").jqGrid('getGridParam', 'selarrrow'); 
      for (var i = 0; i < arraySelected.length; i++) { 
       extraParameters.push($('#gridId').getRowData(arraySelected[i]).user_id) 
      } 
      return { extraParams: extraParameters.join(',') }; 
     } 
    }, 
    { 
     sopt: ['cn', 'nc'], onSearch: function() { 
     }, 
     onReset: function() { 
     } 
    }); 
1

Điều này có thể dễ dàng đạt được nếu bạn thiết lập chính: true trong colModel như thế này:

colModel: [ {name: 'childId', index: 'childId', align: 'center', sorttype: 'string', key:true},

làm tha t sẽ tự động gửi trường này trong quá trình POST.

Mục đích của chính: true trong colModel chỉ là để cho phép bộ xử lý lệnh để hoạt động đúng trên một tập kỷ lục được lập chỉ mục.

+0

Bằng cách đặt khóa: true, nó chỉ gửi giá trị là _id. Bạn không thể gửi dữ liệu trường khác với nó. –

Các vấn đề liên quan