wake-up-neo.com

jquery datatables ajax callback

Ich verwende jQuery DataTables und mache serverseitige Daten. Ich versuche, eine Funktion aufzurufen, wenn der Ajax-Aufruf zurückkehrt. Ich habe versucht, diesen FnCallback2 einzufügen, der meine Funktion und die ursprüngliche Funktion aufruft, aber jQuery gibt nur einen Fehler aus (und sagt mir nicht, was der Fehler ist) und überspringt.

$("#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
    });}});

Ich habe auch versucht, den Parameter fnInitComplete hinzuzufügen, der jedoch nur beim ersten Mal aufgerufen wird, nicht nach den folgenden Seiten.

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

Wie rufe ich meinen Code nach der Ajax-Anfrage korrekt an, damit auch der ursprüngliche Callback aufgerufen wird?

19
Bob Baddeley

Eine andere Option ist die Verwendung von fnDrawCallback , das nach jedem Draw-Ereignis aufgerufen wird. Was wird nach jeder Ajax-Anfrage gemacht.

"fnDrawCallback" : function() {
    update_editable();
}
24
dotjoe

Versuchen Sie es so:

"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)
       } );
}

Sie können dann vor der fnCallback(json);-Zeile tun, was Sie möchten, einschließlich dem Aufruf einer Funktion.

8
ManseUK

LÖSUNG

Mit DataTables 1.10 gibt es mehrere Möglichkeiten, ein Ajax-Beendigungsereignis zu behandeln.

  • Verwenden der Option ajax.dataSrc :

    var table = $("#example").DataTable({
         serverSide: true,
         ajax: {
             url: "/test/0",
             dataSrc: function(d){
    
                 // TODO: Insert your code
    
                 return d.data;    
             }
         }
    });
    
  • Verwenden von xhr event:

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

Die Verwendung der Option xhr event vs. ajax.dataSrc bietet einen weiteren Vorteil:

Ab DataTables 1.10.7 wird dieses Ereignis durch Erfolgs- und Fehlerbedingungen ausgelöst, wenn die Ajax-Anforderung abgeschlossen ist (d. H. Es wird immer ausgelöst, unabhängig vom Ergebnis der Ajax-Anforderung).

DEMO

Siehe this jsFiddle für Code und Demonstration.

6
Gyrocode.com

Versuche dies:

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