2015-08-21 98 views
2

我延長了數據表的默認值,像這樣:如何從ajax/error回調中刷新數據表?

$.extend(true, $.fn.dataTable.defaults, { 
    lengthChange: false, 
    deferRender: true, 
    displayLength: 25, 
    stateSave: false, 
    serverSide: true, 
    processing: true, 
    ajax: { 
     type: 'POST', 
     error: function($xhr) { 
      if($xhr.status === 401) { 
       wxu.openLoginBox(function(data) { 
        // HELP: how can I get the DataTables object from this context? 
       }); 
      } else { 
       wxu.notify({'text': "Could not load list", 'cssClass': 'error', timeout: 0}); 
      } 
     } 
    } 
}); 

有時用戶會得到登出,然後當他們試着改變頁面或排序,它只是說,「處理」,直到永遠。我可以通過查找401錯誤響應(這是我的應用程序在您超時時發送的內容)來捕獲此問題,但之後我不知道如何「刷新」數據表以使「處理」消息消失,因此,你可以繼續使用該應用程序。

請注意,我將這裏的默認值擴展爲.js文件 - 我不知道DataTables此時將綁定什麼元素。

如何從ajax/error回調中「修復」dataTables?

回答

3

注意

你不應該重寫ajax.error因爲此屬性是由數據表內部使用,同樣也適用於ajax.success

SOLUTION

您可以添加事件處理程序xhr事件處理Ajax錯誤(json === null)。

// Prevent alert message from being displayed 
$.fn.dataTable.ext.errMode = 'none'; 

// Use delegated event handler 
// to handle Ajax request completion event 
$(document.body).on('xhr.dt', function (e, settings, json, xhr){ 
    // If there is an Ajax error and status code is 401 
    if(json === null && xhr.status === 401){   
     var api = new $.fn.dataTable.Api(settings); 

     console.log('Session expired'); 
/*  
     wxu.openLoginBox(function(data){ 
      api.ajax.reload(); 
     }); 
*/ 

    } else { 
     console.log('Could not load list'); 
/*  
     wxu.notify({'text': "Could not load list", 'cssClass': 'error', timeout: 0}); 
*/  
    } 
}); 

DEMO

this jsFiddle代碼和演示。

2

the documentation,ajax可以是一個函數。它通過表settings object調用,該表可用於爲表構造一個新的API對象。然後,您可以使用API​​方法獲取處理元素(使用.dataTables_processing)或採用其他可用的其他操作API methods。具體而言,這樣的事情應該工作:

{ 
    "ajax": function (data, callback, settings) { 
    $.ajax({ 
     type: "POST", 
     success: function (json) { 
     callback(json); 
     }, 
     error: function ($xhr) { 
     if ($xhr.status === 401) { 
      var api = new $.fn.dataTable.Api(settings); 
      var container = api.table().container(); 
      $(container).find('.dataTables_processing').hide(); 
     } 
     } 
    }); 
    } 
} 

我沒有看到它具體的記載,但this也被設置爲在ajax功能DataTable對象時,它被調用。使用這可能是一條更直接的路線,但我認爲上述內容更符合預期用途。

+1

我認爲這可能有問題。我仍然需要在每個實例的基礎上設置ajax URL。如果我將'ajax'默認爲一個函數,那麼我將失去對內部屬性的訪問。 – mpen

+1

如果你的''ajax.url'與你的初始化選項一樣正常,它應該被設置爲你函數的屬性,並且可以通過api使用['init()']來獲取(https://datatables.net/參考/ API /的init())。 –

+0

我以爲會工作,但我剛剛嘗試過 - 因爲我擴展了默認值,當我用'{data:{url:'xxx'}}初始化dataTables時,它覆蓋了整個函數。它永遠不會被調用。 – mpen