Как настроить кнопки разбиения на страницы jQuery DataTable и заполнить несколькими вызовами службы

#jquery #spring #datatables

#jquery #spring #таблицы данных

Вопрос:

Я заполняю jQuery datatable списком объектов, который я извлекаю из REST API. Итак, я привязываю это к ModelAttribute и передаю в представление. Таким образом, записи заполняются в таблице. Но проблема в том, что конкретный API возвращает только 10 записей одновременно. Итак, в моем методе обслуживания я извлекаю только 10 записей. Итак, как только datatable загружен, мне нужно выполнить еще один вызов службы и получить остальные записи после нажатия кнопки next в таблице. Как я могу добиться этого с помощью служб и контроллеров? Есть ли лучший способ сделать это, возможно, с помощью AJAX?

Контроллер:

 @Autowired
private PoyntApiClient poyntApiClient;

@RequestMapping(value = "/businessDetails/{businessId}/poynt", method = RequestMethod.GET)
public String viewBusinessDetails(Model model, @PathVariable String businessId) throws IOException {

      PoyntBusinessDetails poyntBusinessDetails = new PoyntBusinessDetails();
      poyntBusinessDetails = poyntApiClient.getPoyntBusinessDetails( businessId);
      model.addAttribute("poyntBusinessDetails", poyntBusinessDetails);

    return POYNT_DETAILS_VIEW;
}
  

Представление :

 <table id="poyntSubcriptionsTable" class="table table-bordered table-striped dataTable">
       <thead>
          <tr>
             <th>Business ID</th>
             <th>Plan Created Date</th>
             <th>Payment Status</th>
             <th>Subscription Phase</th>
             <th>Plan Name</th>
             <th>Status</th>
          </tr>
       </thead>
       <tbody>
         <c:forEach items="${subscriptions}" var="item">
             <tr>
               <td>${item.businessId}</td>
               <td>${item.createdDate}</td>
               <td>${item.paymentStatus}</td>
               <td>${item.phase}</td>
               <td>${item.planName}</td>
               <td>${item.status}</td>                    
             </tr>
          </c:forEach>
        </tbody>
      </table>

<script type="text/javascript">
  $(document).ready(function () {
    $('#poyntSubcriptionsTable').DataTable({})
   });
</script>
  

Ответ №1:

Вам необходимо изменить интерфейс в соответствии со следующим фрагментом кода.

 $('#poyntSubcriptionsTable').DataTable({
            "serverSide": true,
            "processing": true,
            "searchDelay": 1000,
            "ajax": "your-controller/search?action=filterByStateamp;status="   filterStatus,
            "columns": [
                {"data": "id"},
                {"data": "title"}, 
            ],
            "pageLength": 25
        });
  

На серверной части вы получите следующие параметры GET и сможете использовать их в соответствии с вашими требованиями.

 $_GET["start"] - Starting raw number. 
$_GET["length"] - Number of rows to fetch once 
$_GET["draw"] - Draw is a unique identifier for request and response (When ajax request send to do a searching it sends draw value as 1, when composing the search result response draw is set to 1 and re-send)
  

(Предположим, вы установили длину равной 10, и при первой загрузке вы получаете от 1 до 10 записей в качестве первой страницы. Как только вы нажмете на страницу 2, будут получены строки с 11 по 20.)

Из серверной части ваш объект response JSON должен выглядеть следующим образом.

 {
   "data":[
      {
         "id":29629,
         "title":"fghfgh",
         "status":"PUBLISHED",
         "categories":"Accounting Software",
         "ext_ref_id":null,
         "created_time":"2018-08-06 11:45:18"
      },
      {
         "id":29628,
         "title":"hhh",
         "status":"PUBLISHED",
         "categories":"Bakers Supplies",
         "ext_ref_id":null,
         "created_time":"2018-08-06 09:26:24"
      }
   ],
   "recordsTotal":"29646",
   "recordsFiltered":"29646",
   "draw":1
}