2015-12-29 48 views
3

我無法刷新數據表上的數據。由於大量的數據,我使用數據表中的datatable pipeline example。但我無法找到一種方法來強制刷新數據(使用表單,從引導對話)。刷新正在使用管道功能的jQuery數據表

我該如何強制刷新管道?

沒有管道,oTable.api().ajax.reload()完美。但我不明白,我怎麼能在這裏使用功能做同樣的:

// Pipelining function for DataTables. To be used to the 'ajax' option of DataTables 

$.fn.dataTable.pipeline = function (opts) { 
    // Configuration options 
    var conf = $.extend({ 
     pages: 5,  // number of pages to cache 
     url: '',  // script url 
     data: null, // function or object with parameters to send to the server 
         // matching how `ajax.data` works in DataTables 
     method: 'GET' // Ajax HTTP method 
    }, opts); 

    // Private variables for storing the cache 
    var cacheLower = -1; 
    var cacheUpper = null; 
    var cacheLastRequest = null; 
    var cacheLastJson = null; 

    return function (request, drawCallback, settings) { 
     var ajax   = false; 
     var requestStart = request.start; 
     var drawStart  = request.start; 
     var requestLength = request.length; 
     var requestEnd = requestStart + requestLength; 

     if (settings.clearCache) { 
      // API requested that the cache be cleared 
      ajax = true; 
      settings.clearCache = false; 
     } 
     else if (cacheLower < 0 || requestStart < cacheLower || requestEnd > cacheUpper) { 
      // outside cached data - need to make a request 
      ajax = true; 
     } 
     else if (JSON.stringify(request.order) !== JSON.stringify(cacheLastRequest.order) || 
        JSON.stringify(request.columns) !== JSON.stringify(cacheLastRequest.columns) || 
        JSON.stringify(request.search) !== JSON.stringify(cacheLastRequest.search) 
     ) { 
      // properties changed (ordering, columns, searching) 
      ajax = true; 
     } 

     // Store the request for checking next time around 
     cacheLastRequest = $.extend(true, {}, request); 

     if (ajax) { 
      // Need data from the server 
      if (requestStart < cacheLower) { 
       requestStart = requestStart - (requestLength*(conf.pages-1)); 

       if (requestStart < 0) { 
        requestStart = 0; 
       } 
      } 

      cacheLower = requestStart; 
      cacheUpper = requestStart + (requestLength * conf.pages); 

      request.start = requestStart; 
      request.length = requestLength*conf.pages; 

      // Provide the same `data` options as DataTables. 
      if ($.isFunction (conf.data)) { 
       // As a function it is executed with the data object as an arg 
       // for manipulation. If an object is returned, it is used as the 
       // data object to submit 
       var d = conf.data(request); 
       if (d) { 
        $.extend(request, d); 
       } 
      } 
      else if ($.isPlainObject(conf.data)) { 
       // As an object, the data given extends the default 
       $.extend(request, conf.data); 
      } 

      settings.jqXHR = $.ajax({ 
       "type":  conf.method, 
       "url":  conf.url, 
       "data":  request, 
       "dataType": "json", 
       "cache": false, 
       "success": function (json) { 
        cacheLastJson = $.extend(true, {}, json); 

        if (cacheLower != drawStart) { 
         json.data.splice(0, drawStart-cacheLower); 
        } 
        json.data.splice(requestLength, json.data.length); 

        drawCallback(json); 
       } 
      }); 
     } 
     else { 
      json = $.extend(true, {}, cacheLastJson); 
      json.draw = request.draw; // Update the echo for each response 
      json.data.splice(0, requestStart-cacheLower); 
      json.data.splice(requestLength, json.data.length); 

      drawCallback(json); 
     } 
    } 
}; 

// Register an API method that will empty the pipelined data, forcing an Ajax 
// fetch on the next draw (i.e. `table.clearPipeline().draw()`) 
$.fn.dataTable.Api.register('clearPipeline()', function() { 
    return this.iterator('table', function (settings) { 
     settings.clearCache = true; 
    }); 
}); 


// 
// DataTables initialisation 
// 
$(document).ready(function() { 

    oTable = $('#example').dataTable({ 
     "processing": true, 
     "serverSide": true, 
     "ajax": $.fn.dataTable.pipeline({ 
      url: 'scripts/server_processing.php', 
      pages: 5 // number of pages to cache 
     }) 
    }); 
}); 

回答

3

艾倫(數據表的作者)回答his forum這個問題:

The pipeline example code其實註冊一個插件API方法 提供疏通管道的能力 - 你可以使用它 這樣的:

table.clearPipeline().draw(); 

即清除,然後重新裝入。

在我的情況下,我用這個語法

,使其工作:

$('table.dataTable').DataTable().clearPipeline().draw();