DataTables.net столбец таблицы сумма в футере

у меня возникли проблемы с крошечной деталью при вставке значения суммы каждого столбца с классом " sum " в его нижний колонтитул.

код (более или менее взятый прямо из DataTables.net) идет:

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 " имеет правильное значение, но как-то не вставляется в нижний колонтитул! Т. е. its-элемент отображается пустым.

обратите внимание, что фрагмент ниже работает нормально, но я хочу суммировать каждый столбец с классом сумма.

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);
    })
);

////////////////////////////////////////////////////////////////////////////////////

EDIT-обходной путь:

я переместил код туда, где инициализируется DataTable, и вместо этого пошел с footerCallback. См. ниже код:

"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"...

2 ответов


ваш код манипуляции таблицей должен выполняться только при инициализации DataTable (см. initComplete свойства).

также убедитесь, что у вас есть <tfoot></tfoot> блок, определенных в <table> в противном случае не было бы нижнего колонтитула.

в противном случае вы были очень близки к решению, см. ниже исправленный код:

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 свойство, которое позволяет вам определить функцию обратного вызова нижнего колонтитула, которая будет вызываться на каждом событии "draw".

разницу между initComplete и footerCallback это initComplete вызывается один раз а footerCallback на каждом событии "ничья".

если вы показываете сумму для всей таблицы,initComplete должно хватить. В противном случае, если вам нужно показать в нижнем колонтитуле данные, относящиеся только к текущей странице (как в пример обратного вызова нижнего колонтитула), используйте .


Mix. Пустой заменен на 0

"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);
        });
    }