Как обнаружить первую, предыдущую, следующую, последнюю нажатую кнопку в полном типе подкачки в Datatable - PullRequest
0 голосов
/ 29 января 2019

Вы можете перейти к ОБНОВЛЕНИЮ 2 напрямую

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

/*First*/
select top (1000) id, name from table_name order by id desc;
/*returns data from 56679923-56678924*/

/*Next*/
select top (1000) id,name from table_name where id < @previous_lowest_id order by id desc;
/*returns data from 56678923-56677924*/

/*Previous*/
SELECT * FROM 
     (select top (1000) id,name 
       from table_name 
       where id > @previous_highest_id 
       order by id asc
     ) as myAlias 
ORDER BY id desc;
/*returns data from 56679923-56678924*/

/*Last*/
SELECT * FROM 
    (select top (1000) id,name
      from table_name
      order by id asc
    ) as myAlias 
ORDER BY id desc;

Итак, мне нужно выполнять разные запросы в соответствии с нажатыми кнопками.Таким образом, возникает необходимость обнаружения другого клика.Если есть какой-либо встроенный метод, это здорово.В противном случае также приветствуются любые другие хаки для решения этой ситуации.

Кроме того, я могу видеть разные идентификаторы на каждом li, например,

<li class="paginate_button page-item next" id="DataTable_next"> 
    <a href="#" aria-controls="coloradoDataTable" data-dt-idx="2" tabindex="0" class="page-link">Next</a>
</li>

Итак, я также попытался сделать следующеено безуспешно

$('#DataTable_last>a').click(function() { alert('zz'); });

Как я могу избавиться от этой проблемы.Я использую таблицу данных на стороне сервера, на которую можно ссылаться из https://datatables.net/

Обновление:

Теперь я могу обнаружить щелчок, однако я не могу отправить эти новые данные на сервер.В случае, если я установлю var page = 'first';.Эта страница отправки отображается как «первая при каждом запросе».

var page;
var dataTable = $('#DataTable').DataTable( {

                drawCallback: function(){
                    $('.paginate_button.first:not(.disabled)', this.api().table().container())          
                    .on('click', function(){
                        page = 'first';
                        console.log(page);
                    });
                    $('.paginate_button.previous:not(.disabled)', this.api().table().container())          
                    .on('click', function(){
                        page = 'previous';
                        console.log(page);
                    });
                    $('.paginate_button.next:not(.disabled)', this.api().table().container())          
                    .on('click', function(){
                        page = 'next';
                        console.log(page);
                    });
                    $('.paginate_button.last:not(.disabled)', this.api().table().container())          
                    .on('click', function(){
                        page = 'last';
                        console.log(page);
                    });       
                },
    "ajax": {
                    "url":base_path +'/other_path',
                    "dataType":"json",
                    "type":"POST",
                    "data":{"_token":csrf_token,"page":page}
                }
        ......
});

Эти console.log показывают правильную страницу после каждого нажатия кнопки, но в данный момент значение не отправляется с другими параметрами.

Обновление: 2

В настоящее время мой код выглядит следующим образом.Это отправка мимо состояния страницы.Это означает, что если я сначала нажму next, он не отправит страницу, но если я сейчас нажму previous, на этот раз она отправит страницу как next вместо страницы как previous. Похоже, что сначала отправляется ajax-запрос, а позже обновляется значение страницы.Теперь мне просто нужно исправить это означает, что нужно сначала обновить значение страницы перед отправкой ajax.

var page;

var dataTable = $('#masterDataTable').on('preXhr.dt', function (e, settings, data) {
    data.page = page;
}).DataTable( {

    drawCallback: function(){
        $('.paginate_button.first:not(.disabled)', this.api().table().container())          
        .on('click', function(){
            page = 'first';
            console.log(page);
        });
        $('.paginate_button.previous:not(.disabled)', this.api().table().container())          
        .on('click', function(){
            page = 'previous';
            console.log(page);
        });
        $('.paginate_button.next:not(.disabled)', this.api().table().container())          
        .on('click', function(){
            page = 'next';
            console.log(page);
        });
        $('.paginate_button.last:not(.disabled)', this.api().table().container())          
        .on('click', function(){
            page = 'last';
            console.log(page);
        });       
    },

    "processing": true,
    "serverSide": true,
    "searching": false,
    "ajax": {
        "url":base_path +'/other_path',
        "dataType":"json",
        "type":"POST",
        "data":{"_token":csrf_token,"page":page}
    },
    "columns":[
    {"data":"name"},
    {"data":"address"},
    {"data":"city"},
    {"data":"action","searchable":false,"orderable":false}
    ],
    "aLengthMenu": [50, 100, 250, 500],
    "pageLength": 50,

    "ordering": false,
    "pagingType": "full"
} );

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

DataTables отправляют start и length в теле запроса, я думаю, что это проще использовать, не нужно сравнивать, что такое page, и сортировать код.например, pageLength равен 50 и next или page 2 нажата, затем DataTables отправит тело start: 50, length: 50, и ваш запрос будет выглядеть как

SELECT id, name
FROM table_name
ORDER BY id DESC
LIMIT @length OFFSET @start /* LIMIT 50 OFFSET 50 */

, но если вы хотите использовать этот page, вbeforeSend() функция, вы можете попытаться прервать Ajax-запрос, если событие нажатия для кнопки еще не запущено.

var page;
var navClicked = false;
// do not abort ajax for first ajax request or initialization.
var firstLoad = true;
$.ajaxSetup({
  beforeSend: function(jqXHR, settings) {
    // if button click event not yet fired abort ajax
    if (!firstLoad && navClicked == false) {
      jqXHR.abort();
    }
  },
  complete: function() {
    firstLoad = false;
    navClicked = false;
  }
});

, затем замените drawCallback: function(){...} на

drawCallback: function() {
  $('.paginate_button').on('click', function(e) {
    page = this.textContent.toLowerCase(); // first, previous, next, last
    navClicked = true;
    // 'page' already defined click again this button and do ajax request
    this.click()
  })
},
0 голосов
/ 19 февраля 2019

Через некоторое время я нашел обходной путь для такой ситуации.Может быть, это не лучший способ, но он делает свою работу.

$(function(){

            var page;
            var HighestID,LowestID;

                document.addEventListener("click", function(e) {
                    if($(e.target).parent().hasClass('previous')){
                        page = 'previous';
                    }else if($(e.target).parent().hasClass('next')){
                        page = 'next';
                    }else if($(e.target).parent().hasClass('last')){
                        page = 'last';
                    }else{
                        page = 'first';
                    }

                }, true);


            var dataTable = $('#Datatable').on('preXhr.dt', function (e, settings, data) {
                data.page = page;
                data.HighestID = HighestID;
                data.LowestID = LowestID;
            }).DataTable( {

                "processing": true,
                "serverSide": true,
                "searching": false,
                "ajax": {
                    "url":base_path +'/admin/other_path',
                    "dataType":"json",
                    "type":"POST",
                    "data":{"_token":csrf_token}
                },
                "columns":[
                {"data":"name"},
                {"data":"address"},
                {"data":"city"},
                {"data":"action","searchable":false,"orderable":false}
                ],
                "aLengthMenu": [50, 100, 250, 500],
                "pageLength": 50,

                "ordering": false,
                "pagingType": "full"
            } );

            dataTable.on( 'xhr', function () {
                var json = dataTable.ajax.json();
                HighestID = json.HighestID;
                LowestID = json.LowestID;
            } );

});
0 голосов
/ 06 февраля 2019

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

Добавьте это после того, как вы наберете код:

$('#DataTable').on('preXhr.dt', function (e, settings, data) {
    data.page = page;
})

preXhr Событие Ajax - запускается перед выполнением запроса Ajax.

Обновление : Кажется, что события onclick выполняются после создания вызова ajax.Чтобы обойти это, вместо этого можно использовать onmousedown ja ontouchstart события.Они должны запускаться до события onclick по умолчанию

Заменить все события jQuery click на mousedown и touchstart:

$('.paginate_button.last:not(.disabled)', this.api().table().container())          
.on('mousedown touchstart', function(){
    page = 'last';
    console.log(page);
});

Обновление 2:

Более элегантное решение для выполнения щелчка перед вызовом ajax и добавления правильного значения page состоит в добавлении слушателя к фактическому элементу ссылки, а не к родительской кнопке.

Добавьте a кселекторы: .paginate_button.first:not(.disabled) a Это заставит его работать.

$('.paginate_button.first:not(.disabled) a', this.api().table().container())          
        .on('click', function(){
            page = 'first';
            console.log(page);
        });
        $('.paginate_button.previous:not(.disabled) a', this.api().table().container())          
        .on('click', function(){
            page = 'previous';
            console.log(page);
        });
        $('.paginate_button.next:not(.disabled) a', this.api().table().container())          
        .on('click', function(){
            page = 'next';
            console.log(page);
        });
        $('.paginate_button.last:not(.disabled) a', this.api().table().container())          
        .on('click', function(){
            page = 'last';
            console.log(page);
        });
...