как уничтожить таблицу и повторно инициализировать ту же таблицу с новыми обновленными данными с помощью плагина Datatables Jquery

#javascript #php #mysql #function #datatables

Вопрос:

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

  if ( $.fn.dataTable.isDataTable( '#contracts_forecast' ) ) {

  $('#contracts_forecast').DataTable().clear();
  $('#contracts_forecast').DataTable().destroy();
$('#contracts_forecast tbody').empty();
$('#contracts_forecast thead').empty();


}
 

На стороне сервера я вручную редактирую данные и обновляю базу данных. Когда база данных обновляется новыми данными , я хочу обновить таблицу, чтобы изменения отразились в таблице. Для этого я использую событие POST SUBMIT, которое запускается после отправки данных на сервер, а затем вызываю функцию getDT(filter_product_code, filter_product_name) для обновления таблицы новыми данными

проблема:

Когда запускается событие post submit , оно вызывает функцию getDT(filter_product_code, filter_product_name); и изменения отражаются. НО НОВАЯ ТАБЛИЦА С ОБНОВЛЕНИЕМ ДОБАВЛЯЕТСЯ В ТЕКУЩУЮ ТАБЛИЦУ БЕЗ УНИЧТОЖЕНИЯ СТАРОЙ ТАБЛИЦЫ, что оставляет меня с двумя одинаковыми таблицами на экране

p.s. Я предполагаю, что каждый раз, когда вызывается функция getDT (), она должна проверять, инициализирована ли таблица, и уничтожать ее, прежде чем создавать новую, используя ту же самую

    $(document).ready(function() {
    
      $('#filter').click(function(){
    
    
      var  filter_product_code = $('#filter_product_code').val();
      var filter_product_name = $('#filter_product_name').val();
    
    
       if(filter_product_code == '' || filter_product_name == '')
       {
     alert('Select Both filter option');
       }
    
    
    var columns = [];
    
    getDT(filter_product_code, filter_product_name);
    
    function getDT(filter_product_code, filter_product_name) {
    
      $.ajax({
    
                    serverSide: true,
                     type:'POST',
    
             url: "/XXX/_fetch.php",
    
              data:  {filter_product_code: JSON.stringify(filter_product_code),
    
    
               filter_product_name: JSON.stringify(filter_product_name)},
    
                  success: function (data) {
            data = JSON.parse(data);
            columnNames = Object.keys(data.data[0]);
            for (var i in columnNames) {
              columns.push({data: columnNames[i], 
                        title: capitalizeFirstLetter(columnNames[i])});
                                           
    
            }
    
    
    
      if ( $.fn.dataTable.isDataTable( '#contracts_forecast' ) ) {
    
      $('#contracts_forecast').DataTable().clear();
      $('#contracts_forecast').DataTable().destroy();
    $('#contracts_forecast tbody').empty();
    $('#contracts_forecast thead').empty();
    
    
    }
     
        table = $('#contracts_forecast').DataTable({
              data: data.data,
                columns: columns,
              
                dom: "Bfrtip",
                select: true,
            buttons: [
                { extend: "create", editor: editor },
                { extend: "edit",   editor: editor },
                { extend: "remove", editor: editor }
            ],
             "columnDefs": [
                {
                    "targets": [0],
                    "visible": false,
                    "searchable": false
                },
                 { className: "tablecolumns", targets: "_all" },
                ]
            } );
    
       $('#contracts_forecast').on( 'click', 'tbody td:not(:first-child)', function (e) {
    
          editor.inline( this );
    
        } );
    
     }
      
        });
 editor.on( 'postSubmit', function (  e, json, data, action, xhr  ) {

 getDT(filter_product_code, filter_product_name);

      });
    }
    
      });
    
    } );
 

Ответ №1:

Я допустил ошибку, объявив переменную столбца вне функции. Каждый раз, когда вызывалась функция, она добавлялась к уже существующим столбцам. Поэтому просто нужно было определить переменную столбца внутри функции.

 getDT(filter_product_code, filter_product_name);

function getDT(filter_product_code, filter_product_name) {

    var columns = [];


  $.ajax({

                serverSide: true,
                // paging: true,
                // retrieve:true,
                                         type:'POST',