Таблица данных jQuery с итоговой суммой и кнопками

Я новичок в jQuery и работаю над проектом, который использует DataTables для отображения и сортировки данных. Пока у меня есть большинство функций, которые мне нужны, но мой скрипт, который показывает общую сумму столбца, имеет проблемы с моим скриптом кнопок.

Вот мой общий сценарий:

$(document).ready(function() {
  $('#reportTable').DataTable({
    "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 all pages
      total = api.column(4).data().reduce(function(a, b) {
        return intVal(a) + intVal(b);
      }, 0);

      // Total over all filtered pages
      if (api.column(4, {
          search: 'applied'
        }).data().length) {
        pageTotal = api.column(4, {
          search: 'applied'
        }).data().reduce(function(a, b) {
          return intVal(a) + intVal(b);
        });
      } else {
        pageTotal = 0;
      }

      $(api.column(4).footer()).html(pageTotal.toFixed(2));

      // Update footer
      $(api.column(4).footer()).html(pageTotal.toFixed(2) + ' hours ( ' + total.toFixed(2) + ' total hours)');
    }
  });
});

Вот мой скрипт кнопок:

$('#reportTable').DataTable({
  dom: 'Blfrtip',
  buttons: [{
      extend: 'pdf',
      className: 'green glyphicon glyphicon-file',
      title: 'Report',
      filename: 'Report',
      exportOptions: {
        columns: [0, 1, 2, 3, 4, 5, 6]
      }
    },
    {
      extend: 'excel',
      className: 'green glyphicon glyphicon-list-alt',
      title: 'Report',
      filename: 'Report',
      exportOptions: {
        columns: [0, 1, 2, 3, 4, 5, 6]
      }
    },
    {
      extend: 'copy',
      className: 'green glyphicon glyphicon-duplicate',
      exportOptions: {
        columns: [0, 1, 2, 3, 4, 5, 6]
      }
    },
    {
      extend: 'print',
      className: 'green glyphicon glyphicon-print',
      title: 'Report',
      text: 'Print',
      exportOptions: {
        modifier: {
          page: 'current'
        }
      }
    }
  ]
});

Я понимаю, что это проблема инициализации (поскольку я инициализирую дважды), но моя попытка исправить это не работает. Похоже, я смогу сделать что-то вроде этого:

$(document).ready(function() {
  $('#reportTable').DataTable({
    "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 all pages
      total = api.column(4).data().reduce(function(a, b) {
        return intVal(a) + intVal(b);
      }, 0);

      // Total over all filtered pages
      if (api.column(4, {
          search: 'applied'
        }).data().length) {
        pageTotal = api.column(4, {
          search: 'applied'
        }).data().reduce(function(a, b) {
          return intVal(a) + intVal(b);
        });
      } else {
        pageTotal = 0;
      }

      $(api.column(4).footer()).html(pageTotal.toFixed(2));

      // Update footer
      $(api.column(4).footer()).html(pageTotal.toFixed(2) + ' hours ( ' + total.toFixed(2) + ' total hours)');
    }
  }, {
    dom: 'Blfrtip',
    buttons: [{
        extend: 'pdf',
        className: 'green glyphicon glyphicon-file',
        title: 'Report',
        filename: 'Report',
        exportOptions: {
          columns: [0, 1, 2, 3, 4, 5, 6]
        }
      },
      {
        extend: 'excel',
        className: 'green glyphicon glyphicon-list-alt',
        title: 'Report',
        filename: 'Report',
        exportOptions: {
          columns: [0, 1, 2, 3, 4, 5, 6]
        }
      },
      {
        extend: 'copy',
        className: 'green glyphicon glyphicon-duplicate',
        exportOptions: {
          columns: [0, 1, 2, 3, 4, 5, 6]
        }
      },
      {
        extend: 'print',
        className: 'green glyphicon glyphicon-print',
        title: 'Report',
        text: 'Print',
        exportOptions: {
          modifier: {
            page: 'current'
          }
        }
      }
    ]
  });
});

... но у меня это не работает. Я не получаю никаких ошибок, но какой бы сценарий ни находился «наверху», выполняется, а вторая часть игнорируется. Может кто-нибудь объяснить мне логику этого? Я борюсь с синтаксисом.

Спасибо!

Я ценю ваши усилия, но было бы неплохо, если бы вы могли добавить к нему рабочую скрипку. что-то вроде этого jsfiddle.net/rmcmaster/bbLjzspf/22

MyTwoCents 08.08.2018 17:32

Проблема в том, что это связано с базой данных SQL, и синтаксис бритвы отбрасывает мои попытки скрипки. Я посмотрю что я могу сделать.

l337method 08.08.2018 17:41
jsfiddle.net/l337method/9tjoeg8v/3 Извините. Это срочная работа, потому что я не хочу тратить слишком много вашего времени. В настоящее время там работает дополнение, но кнопки не появляются. если вы поменяете их порядок в скрипте, кнопки отобразятся ... но функция суммы исчезнет. > _ <
l337method 08.08.2018 17:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
662
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Примечание: Я еще не тестировал это. Я скоро буду обновлять этот ответ.

Во-первых, я бы посоветовал реорганизовать код по частям, чтобы было легко обнаруживать проблемы. Я только что сделал это и обнаружил некоторые несоответствия в коде.

Ниже приведена очистка последнего фрагмента кода, который вы предоставили.

$( document ).ready(function() {
  $('#reportTable').DataTable({
    "footerCallback": footerCallback, 
    dom: 'Blfrtip',
    buttons: buttons
  });
});

function footerCallback(row, data, start, end, display) {
      var api = this.api();
     
      // 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;
      };


      var sumFn = function(a, b) { return intVal(a) + intVal(b); }
      
      // Total over all pages
      var total = api.column(4).data().reduce(sumFn, 0);
      
      var lengthOpts = { search: 'applied' };
      var length = api.column(4, lengthOpts).data().length;

      // Total over all filtered pages
      if (length) {
        pageTotal = api.column(4, lengthOpts).data().reduce(sumFn);
      } else {
        pageTotal = 0;
      }

      $(api.column(4).footer()).html(pageTotal.toFixed(2));

      // Update footer
      var footerStr = pageTotal.toFixed(2) 
                    + ' hours ( ' 
                    + total.toFixed(2) 
                    + ' total hours)';
      $(api.column(4).footer()).html(footerStr);
  }
  
  function buttons(){
    return [
        {
          extend: 'pdf',
          className: 'green glyphicon glyphicon-file',
          title: 'Report',
          filename: 'Report',
          exportOptions: {
            columns: [0, 1, 2, 3, 4, 5, 6]
          }
        },
        {
          extend: 'excel',
          className: 'green glyphicon glyphicon-list-alt',
          title: 'Report',
          filename: 'Report',
          exportOptions: {
            columns: [0, 1, 2, 3, 4, 5, 6]
          }
        },
        {
          extend: 'copy',
          className: 'green glyphicon glyphicon-duplicate',
          exportOptions: {
            columns: [0, 1, 2, 3, 4, 5, 6]
          }
        },
        {
          extend: 'print',
          className: 'green glyphicon glyphicon-print',
          title: 'Report',
          text: 'Print',
          exportOptions: {
            modifier: {
              page: 'current'
            }
          }
        }
      ];
  }

Метод от l337:

That also worked! Thank you very much for showing me how to reorganize the code. I'll be sure to do that going forward. – l337method

Это тоже сработало! Большое спасибо за то, что показали мне, как реорганизовать код. Я обязательно сделаю это в будущем.

l337method 08.08.2018 18:37

@ l337method Я рад, что мне удалось помочь вам. если бы вы могли проголосовать за ответ положительно, я был бы признателен.

acarlstein 08.08.2018 18:51
Ответ принят как подходящий

Хорошо. Проблема была в скобках

Я буду краток

Это правильный формат

$('#example').DataTable( {
    "paging":   false,
    "ordering": false,
    "info":     false
} );

Вы пытались вот это

$('#example').DataTable( {
    {"paging":   false},
    {"ordering": false},
    {"info":     false}
} );

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

Полный код

$(document).ready(
    function() {
        $('#reportTable').DataTable({

            dom: 'Blfrtip',
            buttons: [{
                    extend: 'pdf',
                    className: 'green glyphicon glyphicon-file',
                    title: 'Report',
                    filename: 'Report',
                    exportOptions: {
                        columns: [0, 1, 2, 3, 4, 5, 6]
                    }
                },
                {
                    extend: 'excel',
                    className: 'green glyphicon glyphicon-list-alt',
                    title: 'Report',
                    filename: 'Report',
                    exportOptions: {
                        columns: [0, 1, 2, 3, 4, 5, 6]
                    }
                },
                {
                    extend: 'copy',
                    className: 'green glyphicon glyphicon-duplicate',
                    exportOptions: {
                        columns: [0, 1, 2, 3, 4, 5, 6]
                    }
                },
                {
                    extend: 'print',
                    className: 'green glyphicon glyphicon-print',
                    title: 'Report',
                    text: 'Print',
                    exportOptions: {
                        modifier: {
                            page: 'current'
                        }
                    }
                }
            ],
            "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 all pages
                total = api
                    .column(5)
                    .data()
                    .reduce(function(a, b) {
                        return intVal(a) + intVal(b);
                    }, 0);

                // Total over all filtered pages
                if (api.column(5, {
                        search: 'applied'
                    }).data().length) {
                    pageTotal = api
                        .column(5, {
                            search: 'applied'
                        })
                        .data()
                        .reduce(function(a, b) {
                            return intVal(a) + intVal(b);
                        });
                } else {
                    pageTotal = 0;
                }

                $(api.column(5).footer()).html(
                    pageTotal.toFixed(2)
                );

                // Update footer
                $(api.column(5).footer()).html(
                    pageTotal.toFixed(2) + ' hours ( ' + total.toFixed(2) + ' total hours)'
                );
            },

        });
    }
);

Рабочая рабочий пример

Это сработало. Спасибо, сэр. Это сводило меня с ума. : D

l337method 08.08.2018 18:35

Другие вопросы по теме