【问题标题】:Datatables - dynamic columns数据表 - 动态列
【发布时间】:2016-09-01 10:03:43
【问题描述】:

我知道以前有人问过这个问题,但我的变体与其他答案不匹配。

我有一个这种形式的 json 数据源:

    {
      "columns":[
          {"title":"Store Number","data":"StoreNbr"},
          {"title":"Store Name","data":"StoreName"},
          {"title":"2016-01-01","data":"2016-01-01"},
          {"title":"2016-01-02","data":"2016-01-02"}
      ],
      "data":[
          {"2016-01-01":"51","StoreNbr":"1","StoreName":"Store 1","2016-01-02":"52"}
      ]
  }

我正在加载这样的数据:

$("#datatable").DataTable({
            "ajax": {
            "url": "http://myjsonurl-that-produces-above-response",
           "dataSrc": "data"
        },

    "columns": [
       {"title":"Store Number","data":"StoreNbr"},
       {"title":"Store Name","data":"StoreName"},
       {"title":"2016-01-01","data":"2016-01-01"},
       {"title":"2016-01-02","data":"2016-01-02"},
     ],   
     dom: "Bfrtip",
    "bProcessing": true,
    "bServerSide" : true
});

上述工作完美无缺。我需要的是动态加载列,如下所示:

"columns": $.getJSON($('#datatable').DataTable().ajax.url(), 
           function(json){
              return (JSON.stringify(json.columns));  
           });

我得到的只是一个 aDataSource 错误。 如果我在代码中的其他任何地方运行 .getJSON 东西,我会得到预期的响应,即我需要的响应。有什么想法吗?

我想让它正常工作,因为我的数据源会根据我应用的影响 json 源、数据集等的过滤器不断变化。

更新:

表的初始化方式:

<script type="text/javascript"> 
          TableManageButtons.init();

TableManageButtons = function () {"use strict"; return { init: function () { handleDataTableButtons()  } }}();

var handleDataTableButtons = function () {
    "use strict";
    0 !== $("#datatable-buttons").length && $("#datatable-buttons").DataTable({
            "ajax": {
            "url": "http://myjsonurl.php",
.......

【问题讨论】:

    标签: javascript jquery json ajax datatables


    【解决方案1】:

    尝试先获取列,然后进行数据表初始化:

    $.getJSON('url/for/colums', function(columnsData) {
       $("#datatable").DataTable({
          ...
          "columns": columnsData
       });
    });
    

    编辑

    如果我理解正确,你想这样做:

    $("#datatable").DataTable({
           "ajax": {
           "url": "http://myjsonurl-that-produces-above-response",
           "dataSrc": "data"
        },
        "columns": getColumns(), //Execute $.getJSON --> asynchronous (the code continous executing without the columns result)
        dom: "Bfrtip",
        "bProcessing": true,
        "bServerSide" : true
    });
    

    这样,当您调用getColumns() 时,执行是异步的,因此列将是未定义的。

    这就是你必须在 getJSON 回调函数中调用 DataTable 初始化程序的原因。

    另一种方法可能是获取非异步函数设置中的列async: false(检查this question

    【讨论】:

    • 当我得到数据包的 json 时,你认为我可以坚持这个吗?例如,在数据表 ajax 调用中添加“完整”= 函数....?
    • 有没有办法在调用数据之后、将数据加载到网格之前设置列?我在任何时候都不会知道这些列,所以我需要根据返回的 JSON 来设置列。
    【解决方案2】:

    一旦您从服务器获得响应,您可以形成一个自定义 js 函数来放置您的标头。看看下面的代码:

    来自服务器的 JSON 响应:

    {
        "columns": [
            [ "Name" ],
            [ "Position" ],
            [ "Office" ],
            [ "Extn." ],
            [ "Start date" ],
            [ "Salary" ]
        ],
        "data": [
        [
          "Tiger Nixon",
          "System Architect",
          "Edinburgh",
          "5421",
          "2011/04/25",
          "$320,800"
        ],....
    }
    

    和 js 方法来处理它以放置标题:

    $( document ).ready( function( $ ) {
            $.ajax({
                    "url": 'arrays_short.txt',
                    "success": function(json) {
                        var tableHeaders;
                        $.each(json.columns, function(i, val){
                            tableHeaders += "<th>" + val + "</th>";
                        });
    
                        $("#tableDiv").empty();
                        $("#tableDiv").append('<table id="displayTable" class="display" cellspacing="0" width="100%"><thead><tr>' + tableHeaders + '</tr></thead></table>');
                        //$("#tableDiv").find("table thead tr").append(tableHeaders);  
    
                        $('#displayTable').dataTable(json);
                    },
                    "dataType": "json"
                });
        });
    

    查看此url 以获得更多说明。 希望这会有所帮助!

    【讨论】:

    • 所以当我需要更新我正在运行的数据表的源时: var table = $('#datatable-buttons').DataTable(); var ajaxurl = table.ajax.url();所以这种方式我只是更新 ajaxurl 变量。在您上面的方法中,我需要调用什么来更新列和数据?
    猜你喜欢
    • 2013-04-07
    • 2013-01-02
    • 2012-12-08
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2013-02-17
    相关资源
    最近更新 更多