我在我的网站中使用了datatable jquery插件。一切顺利。
但是我试图通过使用插件脚本列过滤器来增强表格,然后我想总结页脚中的数据。我可以让过滤器正常工作。
用于汇总数据的数据表中的示例仅适用于数据页面或整个数据集。
我找到了这个帖子:http://datatables.net/forums/discussion/2053/fnfootercallback-sum-column-after-filter/p1寻找类似的解决方案。作者建议以下功能:
._('td:nth-child(4)', {"filter": "applied"})
这显然返回了过滤数据的对象。但是,一旦我有了这个,我不知道从哪里开始添加数据
目前我的数据表脚本(为了帖子而缩短)看起来像这样:
table.dataTable({...
"fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
/*
* Calculate the total sales for the table (ie inc. outside
* the pagination)
*/
var iTotalSales = 0;
for ( var i=0 ; i<aaData.length ; i++ )
{
iTotalSales += aaData[i][2]*1;
}
/* Calculate the total sales on this page */
var iPageSales = 0;
for ( var i=iStart ; i<iEnd ; i++ )
{
iPageSales += aaData[ aiDisplay[i] ][2]*1;
}
/* Modify the footer row to match what we want */
var secondRow = $(nRow).next()[0];
var nCells = secondRow.getElementsByTagName('td');
nCells[0].innerHTML = accounting.formatMoney(iPageSales, "£ ", 2) +
' Page Total ('+ accounting.formatMoney(iTotalSales, "£ ", 2) +' Total Sales)';
}
})
.columnFilter({
aoColumns: [ { type: "date-range" },
null,
{ type: "text" },
{ type: "text" },
{ type: "select" },
{ type: "select" }
]
})
._('td:nth-child(4)', {"filter": "applied"});
我目前有一个如上所述的摘要,它显示页面上过滤的总数与表格总数(所有数据不仅仅是过滤的)
我是一个jquery新手 - 我不知道从哪里开始操纵最后一次调用中创建的对象
谢谢
答案 0 :(得分:4)
当你运行._('td:nth-child(4)', {"filter": "applied"})
时,你会得到一个返回给你的那一列数值的数组。因此,如果您的表在过滤后看起来像这样:
col 1 | col 2 | col 3 | col 4
foo | blah | $18 | 154
bar | blech | $2 | 109
...然后是以下命令
var col4 = $('#mytable').dataTable()._('td:nth-child(4)', {"filter": "applied"})
...会给你col4 = [154, 109]
。从那里,您只需遍历col4以对其值求和,然后在适当的位置手动将结果插入页脚行。
答案 1 :(得分:2)
在数据表1.10中,您可以使用api中的columns方法。请注意,只有在调用.DataTable而不是.dataTable时才存在。因为我正在迁移旧的数据表代码,所以它绊倒了一个小时。
下面的示例创建一个数据表,然后绑定在重新计算页脚时执行的函数。重新计算页脚时,该函数将在表中搜索包含成本的列。然后,它汇总了此列中的值:
请参阅变量searchTotalData
:)
var dataTable = $('#csvtable').DataTable({
'footerCallback': function(row, data, start, end, display){
var api = this.api();
var intval = function(i){
//Excuse this ugliness, it comes from the datatables sample
return typeof i === 'string' ?
i.replace(/[\$,]/g, '')*1 :
typeof i === 'number' ?
i : 0;
};
var costColumnIndex = $('th').filter(function(i){return $(this).text() == 'Cost';}).first().index();
var totalData= api.column(costColumnIndex).data();
var total = totalData.reduce(function(a ,b){ return intval(a) + intval(b); }, 0) .toFixed(2);
var pageTotalData = api.column(costColumnIndex, {page: 'current'}).data();
var pageTotal = pageTotalData.reduce(function(a,b){return intval(a) + intval(b);}, 0).toFixed(2);
var searchTotalData = api.column(costColumnIndex, {'filter': 'applied'}).data();
var searchTotal = searchTotalData.reduce(function(a,b){return intval(a) + intval(b);}, 0).toFixed(2);
$('#cost').html('Approximate page total $' + pageTotal + ', search total $' + searchTotal + ', totally total $' + total);
}
});