数据表共享受排序影响的参数

时间:2015-06-04 13:45:19

标签: jquery sorting datatable

我有一个DataTable,可以随时添加/删除/重新创建N个子DataTable。我希望孩子们共享初始化参数,但似乎DataTables会影响原始数据结构。

添加两个子节点并对第一个子节点进行排序时,第二个子节点将在重新创建时继承排序。我在这里创造了一个小提琴:http://jsfiddle.net/wthY9/44/

var myDataTable;
var index = 0;
var parentParams = {
    "order":[],
    "columns":[
        {"name":"Col 1"},
        {"name":"Col 2"},
        {"name":"Col 3"},
        {"name":"Col 4"},
    ],
};
var childParams = {
    "columns":[
        {"name":"Col 1"},
        {"name":"Col 2"},
        {"name":"Col 3"},
    ],
        "order":[],
};

$(document).ready(function(){
    myDataTable = $('#myTable').DataTable(parentParams);

    $('#createChild').click(function(e){
        e.preventDefault();
        if(typeof myDataTable.row(index).child() == "undefined"){
            var $table = $($('#child_table').html());
            $table.css('width','100%');
            var newChildParams = $.extend({}, childParams);
            var childTable = $table.DataTable(newChildParams);
            myDataTable.row(index).child(
                childTable.table().container()
            );
        }
        myDataTable.row(index).child.show();
        index++;
    });

-    $('#recreateChild').click(function(e){
        e.preventDefault();
        var lastIndex = index - 1;

        var $table = $($('#child_table').html());
        $table.css('width','100%');
        var childTable = $table.DataTable(childParams);
        myDataTable.row(lastIndex).child(
            childTable.table().container()
        );

        myDataTable.row(lastIndex).child.show();
    });

    $('#hideChild').click(function(e){
        myDataTable.row(--index).child.hide();
    });
});

步骤:

  1. 添加两个孩子
  2. 按任意列排序第一个孩子
  3. 使用重新创建按钮
  4. 重新创建第二个孩子
  5. 第二个孩子继承了排序(调试显示默认的childParameters现在有排序集而不是空数组。)
  6. 如何重新创建子项并保持重新创建子项的排序顺序?

    编辑:由于没有答案也没有评论,我已将此问题双重发布到DataTables forum

1 个答案:

答案 0 :(得分:1)

这里的

var newChildParams = $.extend({}, childParams);是浅层副本,这意味着newChildParams仅指向childParams的地址。如果您更改newChildParams中的变量,childParams也会更新。

解决方案是使用深层复制var newObject = jQuery.extend(true, {}, oldObject);。它会将对象复制到另一个内存地址。您可以查看the graph了解详情。

因此,我在您的代码中将深层副本编辑为#createChild#recreateChild,您可以在jsfiddle看到演示。