2015-06-04 47 views
0

我有一個DataTable,可以有N個可隨時添加/刪除/重新創建的子數據表。我希望孩子們分享初始化參數,但似乎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. 二子繼承了順序(調試顯示默認的childParameters現在有排序集而不是空數組)。

我該如何重新創建孩子併爲正在重新創建的孩子保留排序順序?

編輯:由於一直沒有回答,也沒有評論我已經把這個問題發佈到DataTables forum

回答

1

var newChildParams = $.extend({}, childParams);是淺拷貝在這裏,這意味着newChildParams只指向childParams的地址。如果您更改newChildParams中的變量,則childParams也會更新。

解決方法是使用深拷貝var newObject = jQuery.extend(true, {}, oldObject);。它會將對象複製到另一個內存地址。你可以看到the graph瞭解更多詳情。

所以我在你的代碼中編輯了深度複製到#createChild#recreateChild,你可以在jsfiddle看到演示。

+0

啊,當然。因此,如果我想在重新創建表時保留排序順序,則必須將設置對象存儲在某個映射或數組中,以便能夠重新設置順序參數。你會建議什麼? – span

+1

我會用淺拷貝的數組,參見[demo here](http://jsfiddle.net/wthY9/46/)。我添加了'ChildOptionsArray',你可以搜索這個關鍵字來查看一些差異。 – North

+0

真棒,謝謝:) – span