2011-12-01 9 views
5

có sự kiện trong jqGrid để thực hiện hành động sau khi thêm hàng mới không?Cách thực hiện hành động trong jqGrid sau khi thêm hàng mới

Tôi thấy trong jqGrid wiki có sự kiện afterInsertRow, nhưng dường như nó được kích hoạt bất cứ khi nào jqGrid "chèn" hàng vào bảng trong khi hiển thị bảng.

Sau đó, tôi nên sử dụng những gì khi tôi muốn thực hiện điều gì đó sau khi người dùng "chèn" (lưu) hàng mới? Hoặc, có bất kỳ biến nào có thể cho phép tôi "biết" hàng mới đã được thêm vào không?

+0

Bạn nên mô tả chính xác hơn loại "chèn" nào bạn sử dụng. Ví dụ: bạn sử dụng chỉnh sửa biểu mẫu. Người dùng nhấp vào nút "Thêm" và dữ liệu sẽ được lưu thành công trên máy chủ sau khi người dùng nhấp vào nút "Gửi". Bạn muốn thực hiện một số hành động (sửa đổi phản hồi của máy chủ) sau khi nhận được phản hồi từ máy chủ mà dữ liệu đã được thêm thành công. Bạn có gửi lại từ máy chủ 'id' của hàng mới hay không? – Oleg

+0

Có, người dùng nhấp vào nút "thêm", điền vào dữ liệu cho hàng mới, nhấp vào nút "gửi" và hàng mới trong bảng được tạo. Tôi không cần phải sửa đổi phản hồi của máy chủ. Trong trường hợp cụ thể này, tôi chỉ cần chọn hàng đầu tiên trong bảng, sử dụng phương thức setSelection, nhưng tôi cần phải ngăn chặn hành vi đó nếu hàng mới được thêm vào. Đó là lý do tại sao tôi tìm kiếm sự kiện cho điều đó. – cincplug

+0

Và tôi có id hàng được gửi từ máy chủ. – cincplug

Trả lời

4

Vấn đề chính là để có thể chọn hàng bạn cần biết id của hàng mới. Trong hầu hết trường hợp, id sẽ được tạo ra bởi cơ sở dữ liệu nơi bạn lưu dữ liệu trên máy chủ. Vì vậy, yêu cầu đầu tiên đối với mã máy chủ của bạn là trả lại id trên hàng mới trong phản hồi của máy chủ về thao tác "thêm".

Ví dụ: mã máy chủ của bạn trả về id của hàng của bạn làm phản hồi về thao tác "thêm".

$("#list").jqGrid('navGrid', '#pager', {/*navGrid options*/}, {/*Edit optoins*/}, { 
    /*Add options:*/ 
    reloadAfterSubmit: false, 
    afterSubmit: function (response) { 
     return [true, '', response.responseText]; 
    }, 
    addedrow: "last", // add new row at the end of grid 
    afterComplete: function (response, postdata) { 
     // this.gbox is the string like "#gbox_list" 
     var gridId = this.gbox.substr(6); 
     //if (postdata.oper === "add") { 
     // // highlight the new "added" row 
     // var row = $("#" + $.jgrid.jqID(postdata.id)); 
     // row.effect("highlight", {}, 3000); 
     //} 
     $('#' + gridId).jqGrid('setSelection', postdata.id); 
    } 
}); 

Trong phần nhận xét của afterComplete Tôi thấy làm thế nào bạn có thể sử dụng jQuery UI highlight hiệu lực để làm nổi bật dòng thêm mới (xem the old answer). Nó có thể thay thế cho việc lựa chọn hàng. Bạn cũng có thể sử dụng cả hiệu ứng chọn và tô sáng.

Tùy chọn reloadAfterSubmit: false có ít nhất hai nhược điểm.

  1. Nếu sử dụng sử dụng được sắp xếp dữ liệu trong lưới (sortname tham số của jqGrid là không có sản phẩm nào) các hàng của lưới điện sẽ không chính xác được sắp xếp sau hàng mới sẽ được thêm vào như là người đầu tiên hoặc là hàng cuối cùng trong lưới.
  2. Nếu lưới có hàng tối đa trên mỗi trang (được xác định bởi tham số rowNum), việc thêm hàng mới sẽ theo sau vào lưới có quá nhiều hàng trên mỗi trang.

Vì vậy, bạn có thể làm như sau

var idToSelect; 

$("#list").jqGrid({ 
    // ... all jqGrid options 
    loadComplete: function() { 
     if (idToSelect) { 
      $(this).jqGrid('setSelection', idToSelect); 
      //$("#" + $.jgrid.jqID(idToSelect)).effect("highlight", {}, 3000); 
      idToSelect = undefined; 
     } 
    } 
}).jqGrid('navGrid', '#pager', {/*navGrid options*/}, {/*Edit optoins*/}, { 
    /*Add options:*/ 
    afterSubmit: function (response) { 
     // save the id of new row. If the format of the data returned from 
     // the server is different you should change the next row 
     // corresponds to the returned data. For example if the server returns 
     // back JSON data in the form {"myId":"123"} you should use 
     // $.parseJSON(response.responseText).myId 
     // instead of response.responseText below 
     idToSelect = response.responseText; 
     return [true, '', response.responseText]; 
    } 
}); 

Trong trường hợp hàng bổ sung mới sẽ được lựa chọn sau quá trình tải của lưới điện.

+0

Cảm ơn câu trả lời toàn diện này. Cuối cùng tôi đã làm nó với giải pháp thứ hai. – cincplug

+0

@cincplug: Bạn được chào đón! Tôi nghĩ câu hỏi sẽ rất thú vị với những người khác, vì vậy, hãy +1 từ tôi cho câu hỏi của bạn. – Oleg

+0

Vâng cảm ơn, hy vọng nó sẽ :) – cincplug