2011-12-27 35 views
5

Mỗi hàng trong bảng dữ liệu có một nút xóa.Làm thế nào để làm mới jquery datatable sau khi xóa một hàng

On click nút delete, tôi kêu gọi mã này:

$('.deleteButton').live('click', function() { 

      var $this = $(this); 
      var url = $this.attr("id"); 
      $("#example").fnReloadAjax(); 
      $.getJSON(url, Success()); 
     }); 

Url là hành động của bộ điều khiển mà mất Id và xóa dữ liệu từ cơ sở dữ liệu. Điều đó hoạt động. Bây giờ tôi muốn gọi hàm refresh/redraw của datatable để nó có thể tải kết quả mới nhưng nó không hoạt động.

DataTable là:

$("#example").dataTable({ 
      "aoColumns": [ 
        { "sTitle": "Id" }, 
         { "sTitle": "Name" }], 


      "bProcessing": true, 
      "bServerSide": true, 

      "sAjaxSource": '@Url.Action("FetchData", "Home")', 
      "sPaginationType": "full_numbers", 

}); 

bất cứ ai có thể vui lòng tư vấn?

Trả lời

9

Phần trích dẫn từ API datatable page - trên fnReloadAjax() đạn:

Lưu ý: Để tải lại dữ liệu khi sử dụng chế biến server-side, chỉ cần sử dụng tích hợp chức năng API fnDraw hơn là plug-in này.

Vì vậy, bạn nên sử dụng tốt hơn fnDraw.

[EDIT] Trên thực tế, thứ tự của các cuộc gọi của bạn nên là:

// you don't have to use $.json because you don't use the downloaded data 
// first, ask the server to delete the data 
$.ajax({ 
    url: urlToDelete, 
    success: function() { 
     // if it worked, ask datatable to redraw the table with the new data 
     $("#example").dataTable().fnDraw(); 
     // if this js function does anything useful (like deleting the row), then call it: 
     Success(); 
    }, 
    error: function() { 
     // display any error (like server couldn't be reached...), or at least try to log it 
    } 
}); 
+0

tôi muốn gọi phía máy chủ chức năng xóa. có cách nào tốt hơn để gọi hành động đó không? – InfoLearner

+0

sau đó, bạn nên gọi nó * trước * yêu cầu vẽ lại. Tôi sẽ chỉnh sửa câu trả lời của mình để rõ ràng hơn – JMax

+0

như trước đây, nó có thể đi vào chức năng thành công nhưng nó không làm mới dữ liệu? – InfoLearner

1

Câu trả lời ở đây không làm việc cho tôi, vì vậy tôi sử dụng này:

http://datatables.net/plug-ins/api#fnReloadAjax

Thêm này vào một tệp:

$.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, fnCallback, bStandingRedraw) 
{ 
    if (sNewSource !== undefined && sNewSource !== null) { 
     oSettings.sAjaxSource = sNewSource; 
    } 

    // Server-side processing should just call fnDraw 
    if (oSettings.oFeatures.bServerSide) { 
     this.fnDraw(); 
     return; 
    } 

    this.oApi._fnProcessingDisplay(oSettings, true); 
    var that = this; 
    var iStart = oSettings._iDisplayStart; 
    var aData = []; 

    this.oApi._fnServerParams(oSettings, aData); 

    oSettings.fnServerData.call(oSettings.oInstance, oSettings.sAjaxSource, aData, function(json) { 
     /* Clear the old information from the table */ 
     that.oApi._fnClearTable(oSettings); 

     /* Got the data - add it to the table */ 
     var aData = (oSettings.sAjaxDataProp !== "") ? 
      that.oApi._fnGetObjectDataFn(oSettings.sAjaxDataProp)(json) : json; 

     for (var i=0 ; i<aData.length ; i++) 
     { 
      that.oApi._fnAddData(oSettings, aData[i]); 
     } 

     oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); 

     that.fnDraw(); 

     if (bStandingRedraw === true) 
     { 
      oSettings._iDisplayStart = iStart; 
      that.oApi._fnCalculateEnd(oSettings); 
      that.fnDraw(false); 
     } 

     that.oApi._fnProcessingDisplay(oSettings, false); 

     /* Callback user function - for event handlers etc */ 
     if (typeof fnCallback == 'function' && fnCallback !== null) 
     { 
      fnCallback(oSettings); 
     } 
    }, oSettings); 
}; 

Bao gồm tệp trên trang của bạn và gọi như này:

// Example call to load a new file 
oTable.fnReloadAjax('media/examples_support/json_source2.txt'); 

// Example call to reload from original file 
oTable.fnReloadAjax(); 
3

Tôi có thể giải quyết vấn đề này với nhiều cách tiếp cận đơn giản hơn các câu trả lời ở trên.

Ajax cuộc gọi để xóa dữ liệu từ backend

Trước hết xóa dữ liệu từ backend sử dụng bình thường gọi ajax async.

Xóa từ frontend DataTable

Lấy TR hàng mà bạn muốn xóa và sử dụng chức năng DataTable fnDeleteRow xóa hàng này. Điều này sẽ tự động làm mới bảng, do đó bạn sẽ không cần bất kỳ fnDraw hoặc các nội dung khác.

//in my case its delete button which was clicked 
//so I got its parents parent which is TR row 
var row = $(this).parent().parent(); 


$('DATA TABLE SELECTOR').dataTable().fnDeleteRow(row); 

Và bạn đã làm xong .. :-)

+0

tốt nhất ... làm việc cho tôi – MKD

0

Sử dụng thể hiện của DataTable và loại bỏ hàng từ DataTable

dataTable.fnDeleteRow($(that).closest('tr').remove()); 
dataTable.fnDraw(); 
Các vấn đề liên quan