jquery datatables ajax обратный вызов - PullRequest
19 голосов
/ 06 октября 2011

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

$("#brands").dataTable( {
"bServerSide" : true,
"sAjaxSource" : "ajax.php",
"fnServerData" : function(sSource, aoData, fnCallback) {
    fnCallback2 = function(a,b,c){
        fnCallback.call(a,b,c);
        update_editable();
    };
    $.ajax( {
        "dataType" : 'json',
        "type" : "POST",
        "url" : sSource,
        "data" : aoData,
        "success" : fnCallback2
    });}});

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

"fnInitComplete": function(){
update_editable();
},

Как правильно вызвать мой код после запроса ajax, чтобы также вызывался исходный обратный вызов?

Ответы [ 4 ]

25 голосов
/ 06 октября 2011

Другой вариант - использовать fnDrawCallback , который вызывается после каждого события рисования. Что будет сделано после каждого запроса AJAX.

"fnDrawCallback" : function() {
    update_editable();
}
8 голосов
/ 06 октября 2011

Попробуйте следующим образом:

"fnServerData": function ( sSource, aoData, fnCallback ) {
       /* Add some extra data to the sender */
       aoData.push( { "name": "more_data", "value": "my_value" } );
       $.ajax( {
         "dataType" : 'json',
         "type" : "POST",
         "url" : sSource,
         "data" : aoData,
         "success" : function(json) {
           /* Do whatever additional processing you want on the callback, 
             then tell DataTables */
           fnCallback(json)
       } );
}

После этого вы можете делать все, что захотите, до строки fnCallback(json);, включая вызов функции.

6 голосов
/ 18 октября 2015

РЕШЕНИЕ

В DataTables 1.10 есть несколько способов обработки события завершения Ajax.

  • Использование ajax.dataSrc опция:

    var table = $("#example").DataTable({
         serverSide: true,
         ajax: {
             url: "/test/0",
             dataSrc: function(d){
    
                 // TODO: Insert your code
    
                 return d.data;    
             }
         }
    });
    
  • Использование xhr событие:

    $("#example").on('xhr.dt', function(e, settings, json, xhr){
        // TODO: Insert your code
    });
    
    var table = $("#example").DataTable({
         serverSide: true,
         ajax: {
             url: "/test/0"
         }
    });
    

Есть еще одно преимущество использования xhr событие против ajax.dataSrc опция:

Начиная с DataTables 1.10.7 это событие вызывается как условиями успеха, так и ошибками, когда завершается запрос Ajax (т.е.он всегда запускается независимо от результата запроса Ajax).

DEMO

См. этот jsFiddle для кода и демонстрации.

0 голосов
/ 27 марта 2012

Попробуйте:

"fnServerData": function ( sSource, aoData, fnCallback ) {
    $.getJSON( sSource, aoData, function (json) { 
       fnCallback(json)
}).complete(function(){update_editable(););
}
...