自动展开响应数据表的子行
Expand Child Rows of Responsive Datatables automatically
我有一个响应式数据表 (Responsive doc.),格式如下:
var dataTableInfo = j$('[id$="dataTableInfo"]').DataTable({
responsive: {
"autoWidth": true,
details: {
type: 'column',
target: 0
}
},
columnDefs: [ {
className: 'control',
orderable: false,
targets: 0
} ]
});
我通过搜索外部数据源用数据填充它,然后我在 DataTable 中有第二个 table,其中包含来自我的实例化的附加数据(在子行中)。我可以单击第一列中的图标展开并显示子行,一切正常。
我想要完成的是,一旦加载了所有数据(我知道这何时发生在回调函数中),通过此 DataTable 的 Javascript 自动扩展子行。
我尝试了以下多种变体:
function ExpandTable(){
var tab = j$('[id$="dataTableInfo"]').DataTable();
alert(tab);
tab.rows().every( function () {
this.child.show();
} );
}
但我的 table 根本不会扩展其子行。没有任何反应,控制台中也没有错误消息。
谁能帮我解释一下我是如何模拟按钮点击的:
$('#example tbody').on( 'click', 'tr', function () {
var child = table.row( this ).child;
if ( child.isShown() ) {
child.hide();
}
else {
child.show();
}} );
或以任何其他方式自动扩展子行。
再见!
原因
Responsive 插件似乎有自己的子行管理,也许这就是 row().child.show()
不起作用的原因。
解决方案
我正在使用未记录的 responsive._detailsDisplay()
方法来触发子行的显示。
// Enumerate all rows
table.rows().every(function(){
// If row has details collapsed
if(!this.child.isShown()){
// Expand row details
table.settings()[0].responsive._detailsDisplay(this, false);
}
});
例子
有关代码和演示,请参阅 this example。
链接
有关更多示例和信息,请参阅 jQuery DataTables: jQuery DataTables: How to expand/collapse all child rows。
您还可以在 DataTable 初始化的行回调中添加 class "parent" 到行:
$('.table-container table').DataTable({
"rowCallback": function (row, data, index) {
var that = row;
if(!$(row).attr('role') || $(row).attr('role') != 'row' || $(row).hasClass('parent')){
return;
}
$(row).addClass('parent');
}});
这是最佳方法,因为您不必遍历所有行 post 渲染。因此,与其在 O(n^2) 中执行,您将能够一举完成此操作,即 O(n).
自 DataTables Responsive v2.0.0+(2015 年 11 月发布)
您可以使用选项 childRowImmediate
立即显示子项(折叠的数据)。
$('#example').DataTable( {
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.childRowImmediate,
type: ''
}
}
} );
在文档中,他们为此提供了 dedicated example。
如果您还希望切换图标继续使用,请将 type
属性设置为 inline
:
$('#example').DataTable( {
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.childRowImmediate,
type: 'inline'
}
}
} );
我有一个响应式数据表 (Responsive doc.),格式如下:
var dataTableInfo = j$('[id$="dataTableInfo"]').DataTable({
responsive: {
"autoWidth": true,
details: {
type: 'column',
target: 0
}
},
columnDefs: [ {
className: 'control',
orderable: false,
targets: 0
} ]
});
我通过搜索外部数据源用数据填充它,然后我在 DataTable 中有第二个 table,其中包含来自我的实例化的附加数据(在子行中)。我可以单击第一列中的图标展开并显示子行,一切正常。
我想要完成的是,一旦加载了所有数据(我知道这何时发生在回调函数中),通过此 DataTable 的 Javascript 自动扩展子行。
我尝试了以下多种变体:
function ExpandTable(){
var tab = j$('[id$="dataTableInfo"]').DataTable();
alert(tab);
tab.rows().every( function () {
this.child.show();
} );
}
但我的 table 根本不会扩展其子行。没有任何反应,控制台中也没有错误消息。
谁能帮我解释一下我是如何模拟按钮点击的:
$('#example tbody').on( 'click', 'tr', function () {
var child = table.row( this ).child;
if ( child.isShown() ) {
child.hide();
}
else {
child.show();
}} );
或以任何其他方式自动扩展子行。
再见!
原因
Responsive 插件似乎有自己的子行管理,也许这就是 row().child.show()
不起作用的原因。
解决方案
我正在使用未记录的 responsive._detailsDisplay()
方法来触发子行的显示。
// Enumerate all rows
table.rows().every(function(){
// If row has details collapsed
if(!this.child.isShown()){
// Expand row details
table.settings()[0].responsive._detailsDisplay(this, false);
}
});
例子
有关代码和演示,请参阅 this example。
链接
有关更多示例和信息,请参阅 jQuery DataTables: jQuery DataTables: How to expand/collapse all child rows。
您还可以在 DataTable 初始化的行回调中添加 class "parent" 到行:
$('.table-container table').DataTable({
"rowCallback": function (row, data, index) {
var that = row;
if(!$(row).attr('role') || $(row).attr('role') != 'row' || $(row).hasClass('parent')){
return;
}
$(row).addClass('parent');
}});
这是最佳方法,因为您不必遍历所有行 post 渲染。因此,与其在 O(n^2) 中执行,您将能够一举完成此操作,即 O(n).
自 DataTables Responsive v2.0.0+(2015 年 11 月发布)
您可以使用选项 childRowImmediate
立即显示子项(折叠的数据)。
$('#example').DataTable( {
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.childRowImmediate,
type: ''
}
}
} );
在文档中,他们为此提供了 dedicated example。
如果您还希望切换图标继续使用,请将 type
属性设置为 inline
:
$('#example').DataTable( {
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.childRowImmediate,
type: 'inline'
}
}
} );