【问题标题】:Datatables column definitions and reorder not applied after reload重新加载后未应用数据表列定义和重新排序
【发布时间】:2013-04-23 14:17:58
【问题描述】:

我有许多进程使用相同的数据,当用户在页面上时这些数据会定期更新。现在我想使用数据表来显示这些数据。

我也使用 ColReorder 插件。

问题是我不明白如何强制数据表用新数据“重新加载”这个本地变量。

在“aoColums”设置中也有一堆定义,使用一些数据字段用于图像等。

我更改了 dat var 中的一些数据。试图强制数据表将其放入表中。没有运气。我在 api 中找不到合适的示例或函数来使用。

如果我尝试使用 oTable.fnClearTable() 和 oTable.fnAddData(data) 数据会被加载,但不知何故 ColReorder 不适用。

myTable = $('#myTable').dataTable({
    "aoColumns": [ ... ],
    "aaSorting": [[1, 'asc']],
    "aaData": data,
    "sScrollY": 200,
    "sScrollX": "100%",
    "sScrollXInner": "150%",
    "bJQueryUI": true,
    "sPaginationType": "full_numbers",
    "sDom": 'R<"H"lfr>t<"F"ip>',
    "iFixedColumns": 3,
    "oColReorder": {
        "aiOrder": [ 0, 8, 2, 3, 4, 5, 6, 7, 1, 9 ]
    }
});

有什么想法吗?

编辑 我制作了一个有效的jsFIddle,并解释了整个问题。看看就走吧!

【问题讨论】:

  • 你用的是json数组吗?
  • 不,它是一个普通数组,每行都有数组。 (没有字段名称,只有数据 [ [ cell1, cell2], [cell3, cell4] ]。你有它与 json 一起使用吗?
  • 你看到 js 数组的文档了吗? datatables.net/examples/data_sources/js_array.html
  • 是的,我实际上构建了这样一个东西,问题是我希望数据表重新加载提供的 js_array。如果我需要创建一个逐行迭代它的函数,那也可以
  • 请参阅编辑中的 jsFiddle 以获取更多详细信息(有问题的工作示例!)

标签: php javascript jquery datatables


【解决方案1】:

我读到了您的问题....我对您的问题采取了另一种方法(总是关于 dom 操作 xD)...我的答案不是最聪明的,但我认为它有效。

  • 我将数据表操作放在一个函数中,并在表中添加一个 div
  • 然后我调用那个函数
  • 更新时,我清空 div 并添加与表在数据表操作和填充之前相同的 html
  • 然后调用函数再次绘制整个数据表,这样 ColReorder 插件就可以处理更新的数据。

PS:这里是更新的小提琴更多细节:http://jsfiddle.net/aKuHM/5

现在表格如下所示:

<div class="Example" id="Example">
<table id="myTable" class="datatable">
 <thead>
 </thead>
   <tbody>
   </tbody>
 <tfoot>
 </tfoot>
</table>
</div>

你的 JS 加载在头部,看起来是这样的:

data = [
            ['cell1', 'cell2','cell3','cell4','cell5','cell6','cell17', 'cell8', 'cell9', 'cell10'],
            ['cell1', 'cell2','cell3','cell4','cell5','cell6','cell17', 'cell8', 'cell9', 'cell10'],
            ['cell1', 'cell2','cell3','cell4','cell5','cell6','cell17', 'cell8', 'cell9', 'cell10'],
        ];
        function Saludos(){
        $(function(){
            myTable = $('#myTable').dataTable({
                "aoColumns": [
                    {"sTitle":"col0", "bSearchable": false, "bVisible": true},
                    {"sTitle":"col1", "bSearchable": false, "bVisible": true},
                    {"sTitle":"col2", "bSearchable": true, "bVisible": true},
                    {"sTitle":"col3", "bSearchable": true, "bVisible": true},
                    {"sTitle":"col4", "bSearchable": true, "bVisible": true},
                    {"sTitle":"col5", "bSearchable": false, "bVisible": true},
                    {"sTitle":"col6", "bSearchable": true, "bVisible": true},
                    {"sTitle":"col7", "bSearchable": false, "bVisible": true},
                    {"sTitle":"col8", "bSearchable": true, "bVisible": true,
                        "mRender": function (data, type, row){
                            return '<b><i>'+ row[8] +'</i></b>';
                        }
                    },
                    {"sTitle":"col9", "bSearchable": false, "bVisible": false},
                ],    
                "aaSorting": [[8, 'asc']],
                "aaData": data,
                "sScrollY": 200,
                "sScrollX": "100%",
                "sScrollXInner": "150%",
                "bJQueryUI": true,
                "sPaginationType": "full_numbers",
                "sDom": 'R<"H"lfr>t<"F"ip>',
                "iFixedColumns": 3,
                "oColReorder": {
                    "aiOrder": [ 0, 8, 2, 3, 4, 5, 6, 7, 1, 9 ]
                }
            });

            $('#updatebutton').click(function(){
                updateTable();
            });
        });

        }
        Saludos();
        function updateTable(){
            data[1][8] = "even bolder";
            $('.Example').empty();
            $("#Example").html("<table id='myTable' class='datatable'><thead></thead>  <tbody></tbody><tfoot></tfoot></table>");
            Saludos();
            console.log(data);

        }

【讨论】:

  • 嗨罗伯特!虽然我认为扔掉桌子,重新创建它是“更新”事物的一种非常糟糕的方式。这是一个有效的解决方案。即使在 jsFiddle 中,它的运行速度也非常快。如果您使用“bStateSave”:true,它甚至会保留重建之间的更改。
  • 是的,我认为是同一个人......但这是我唯一能想到的......而且,就像你说的,工作速度很快,这是使用插件的唯一方法;基本上是因为您使用 2 种不同的方式来填充表格......它必须以相同的方式完成,加载和更新......它必须是一种更优雅的方式,但是,如果你认为我的答案有效,不要忘记将其标记为正确....saludos ;)
  • 当然,当我在站点中实施时会这样做。现在更新后搜索工作错误。不是在你的例子中......有点奇怪......
  • 我已经解决了这些问题:即使在重建之后,表格的数据格式(数组数组或对象数组)也需要相同(否则会中断搜索)。您需要在重新创建表之前清理您耦合的其他事件(例如行展开)。
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 2014-02-02
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多