DataTables.net table column sum in footer
在将每个类别为" sum"的列的总和值插入其页脚中时,我遇到了一个很小的细节问题。
代码(或多或少直接取自DataTables.net)是:
1 2 3 4 5 6 7 8 9 10 | var table = $('#example').DataTable(); table.columns('.sum').each(function (el) { var sum = table .column(el) .data() .reduce(function (a, b) { return parseInt(a, 10) + parseInt(b, 10); }); $(el).html('Sum: ' + sum); }); |
" sum"具有正确的值,但不以某种方式未插入页脚!即其-e元素显示为空。
请注意,下面的代码片段工作正常,但是我想用类sum来对每一列求和。
1 2 3 4 5 6 7 8 | var table = $('#example').DataTable(); var column = table.column(4); $(column.footer()).html( column.data().reduce(function (a, b) { return parseInt(a, 10) + parseInt(b, 10); }) ); |
///////////////////////////////////////////////////// //////////////////////////////////
编辑-解决方法:
我将代码移到了初始化DataTable的位置,并改为使用footerCallback。参见下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | "footerCallback": function (row, data, start, end, display) { var api = this.api(), data; // Remove the formatting to get integer data for summation var intVal = function (i) { return typeof i === 'string' ? i.replace(/[\\$,]/g, '') * 1 : typeof i === 'number' ? i : 0; }; // Total over this page pageTotal = api .column('.sum', { page: 'current' }) .data() .reduce(function (a, b) { return intVal(a) + intVal(b); }, 0); // Update footer $(api.column('.sum').footer()).html(pageTotal); } |
现在以某种方式将值插入到右侧的tfoot元素中。仍然不知道为什么它一开始就不起作用(但正如注释顺序中提到的那样,包括JS文件可能与其中的某些内容有关)。
现在,我只需要弄清楚如何使用class =" sum"循环多列...
仅在初始化DataTable时才需要执行表操作代码(请参阅initComplete属性)。
还要确保在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var table = $('#ticketTable').DataTable({ 'initComplete': function (settings, json){ this.api().columns('.sum').every(function(){ var column = this; var sum = column .data() .reduce(function (a, b) { a = parseInt(a, 10); if(isNaN(a)){ a = 0; } b = parseInt(b, 10); if(isNaN(b)){ b = 0; } return a + b; }); $(column.footer()).html('Sum: ' + sum); }); } }); |
有关示例,请参见此JSFiddle。
更新
还有footerCallback属性,可让您定义页脚显示回调函数,该函数将在每个"绘制"事件上调用。
如果要显示整个表的总和,
混合。 空置为0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | "initComplete": function (settings, json) { this.api().columns('.sum').every(function () { var column = this; var intVal = function (i) { return typeof i === 'string' ? i.replace(/[\\$,]/g, '') * 1 : typeof i === 'number' ? i : 0; }; var sum = column .data() .reduce(function (a, b) { return intVal(a) + intVal(b); }); $(column.footer()).html('Sum: ' + sum); }); } |