Как перезагрузить данные таблицы, используя DataTables, Ajax call и Json response? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица, которая генерируется через Thymeleaf. Я хотел бы обновить содержимое таблицы с помощью jQuery.

    <table class="table table-hover" id="main-table">
        <thead class="thead-inverse">
            <tr>
                <th class="col-md-2 text-center">Network Id</th>
                <th class="col-md-2 text-center">Rep date</th>
                <th class="col-md-2 text-center">Hashrate [KH/s]</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="networkHashrate : ${networkHashrates}" th:onclick="'javascript:openPoolModal(\''+ ${networkHashrate.id} + '\');'">
                <td class="text-center" id="hashrateId" th:text="${networkHashrate.id}"> Sample id</td>
                <td class="text-center" id="repDate" th:text="${@findAndDisplayDataService.formatDate(networkHashrate.repDate)}">Sample rep-date</td>
                <td class="text-center" id="hashrate" th:text="${@findAndDisplayDataService.formatHashrate(networkHashrate.hashrate)}">Sample hashrate</td>
            </tr>
        </tbody>
    </table>

Я придумал такую ​​функцию для обновления содержимого таблицы каждые 8 ​​секунд:

$(document).ready(function() {
var table = $('#main-table').DataTable({
           ajax: {
                url: '/refresh',
                dataSrc:''

            },
           paging: true,
           lengthChange: false,
           pageLength: 20,
           stateSave: true,
           info: true,
           searching: false,
           "aoColumns": [
             { "orderSequence": [ "asc", "desc" ] },
             { "orderSequence": [ "asc", "desc" ] },
             { "orderSequence": [ "desc", "asc" ] }
           ],
           "order": [[ 0, "asc" ]]
});


setInterval(function(){
table.ajax.reload();
}, 8000);
});

Вот ответ JSON:

[{  
  "id":1,
  "repDate":{  
     "offset":{  },
     "nano":880042000,
     "year":2018,
     "monthValue":4,
     "dayOfMonth":25,
     "hour":12,
     "minute":58,
     "second":53,
     "month":"APRIL",
     "dayOfWeek":"WEDNESDAY",
     "dayOfYear":115
  },
  "hashrate":5114926.0
},...more entries
]

Напечатана пустая таблица, и я получаю сообщение об ошибке:

Uncaught TypeError: Cannot read property 'reload' of undefined

Также есть всплывающее окно с предупреждением:

Data Tables warning: table id=main-table - Requestem unknown parameter '0' for row 0 column 0. For more information about this error, please see: http://datatables.net/tn/4

РЕДАКТИРОВАТЬ

Я переместил объявление таблицы за пределы функции. Теперь я просто продолжаю получать предупреждение.


РЕДАКТИРОВАТЬ 2

Я сделал, как вы сказали, данные продолжают обновляться, но проблем все еще мало.

Прежде всего, мое свойство stateSave: true перестало работать, поэтому при перезагрузке таблицы оно всегда возвращается на первую страницу.
Во-вторых, я потерял все свои стили (например, class="text:center") и свойство on:click, которые изначально были в моем файле html.

1 Ответ

0 голосов
/ 26 апреля 2018

Попробуйте объявить таблицу перед $ (document) .ready:

var table;
$(document).ready(function() {
  table = $('#main-table').DataTable({"serverSide": true, ...})
  setInterval(function(){
     table.ajax.reload();
   }, 8000);
})

Ошибка связана с определением столбца. Попробуйте определить столбцы следующим образом:

 "columnDefs": [
                    {
                        "targets": 0,
                        "data": "id",
                    },
                    {
                        "targets": 1,
                        "data": "repDate",
                    },
                    {
                        "targets": 2,
                        "data": "repDate",
                    }
                ]
...