2016-07-27 6 views
1

Ich versuche, zwei AJAX-Aufrufe zu vermeiden, indem ich .ajax.params() verwende, um die letzten AJAX-Parameter zu erhalten und die Tabellendaten von meinem ersten Aufruf zurückzugeben.Manuelles Laden von Aktualisierungsdatatadaten ohne Aufruf von AJAX

ich in meinem eigenen json zu Datentabellen nach diesem Muster

datatable.clear(); 
datatable.rows.add(newDataArray); 
datatable.draw(); 

von diesem question passieren dann.

Allerdings hat meine Tabelle Ajax so eingestellt, wenn draw() aufgerufen wird, wird ein anderer Ajax-Aufruf ausgelöst, der den Punkt der Weitergabe der Daten selbst besiegt. Was ich brauche, ist eine Möglichkeit, den Ajax-Aufruf zu unterdrücken, während die Tabelle neu gezeichnet wird.

Eine Alternative wäre, meine eigene Ajax-Behandlung zu schreiben und manuell die Daten in Datatables wie oben hinzuzufügen, aber ich denke, dass ich auch die Ajax-Parameter selbst erstellen müsste, was ein Schmerz wäre.

+0

Warum wollen Sie einen AJAX-sourced Tisch haben wollen, aber dann manuell Reihen hinein laden? Warum nicht bei der einen oder anderen Methode bleiben? –

+0

Wenn bestimmte Ereignisse auftreten, mache ich einen Ajax-Aufruf, um Daten auf der Serverseite zu aktualisieren, manchmal ändern diese die Daten hinter der Tabelle. Momentan, wenn dieser Ajax-Aufruf zurückkommt, teilt er der Datatable das Redraw mit, allerdings verwendet dies einen anderen Ajax-Aufruf, den ich vermeiden möchte. – edlouth

+0

Vielleicht gehe ich das in die falsche Richtung, anstatt die Daten von einem anderen Ajax-Aufruf zu laden, könnte ich den Datatables-Aufruf mit table.ajax.url ändern und zusätzliche Parameter mit ajax.data hinzufügen (nicht sicher, wie man dies nach der Initialisierung setzt) . Die Frage wird dann, wie das Neuzeichnen basierend auf dem zurückgegebenen JSON abgebrochen wird. – edlouth

Antwort

0

Ich habe das folgende Datatabellen-Plugin erstellt, das es ermöglicht, eine Ajax-Ladung mit benutzerdefinierten Ajax-Einstellungen nur einmal auszuführen.

var __reload = function (settings, holdPosition, callback) { 
    // Use the draw event to trigger a callback 
    if (callback) { 
     var api = new _Api(settings); 

     api.one('draw', function() { 
      callback(api.ajax.json()); 
     }); 
    } 

    if (settings.oApi._fnDataSource(settings) == 'ssp') { 
     settings.oApi._fnReDraw(settings, holdPosition); 
    } 
    else { 
     settings.oApi._fnProcessingDisplay(settings, true); 

     // Cancel an existing request 
     var xhr = settings.jqXHR; 
     if (xhr && xhr.readyState !== 4) { 
      xhr.abort(); 
     } 

     // Trigger xhr 
     settings.oApi._fnBuildAjax(settings, [], function(json) { 
      settings.oApi._fnClearTable(settings); 

      var data = settings.oApi._fnAjaxDataSrc(settings, json); 
      for (var i=0, ien=data.length ; i<ien ; i++) { 
       settings.oApi._fnAddData(settings, data[i]); 
      } 

      settings.oApi._fnReDraw(settings, holdPosition); 
      settings.oApi._fnProcessingDisplay(settings, false); 
     }); 
    } 
}; 

jQuery.fn.dataTable.Api.register('ajax.loadOnce()', function (ajax, callback, resetPaging) { 
    return this.iterator('table', function (ctx) { 
     store = ctx.ajax; 
     ctx.ajax = ajax; 
     __reload(ctx, resetPaging===false, callback); 
     ctx.ajax = store; 
    }); 
}); 

Dies macht es möglich, die Datentabellen Parameter mit benutzerdefinierten Daten zu kombinieren und eine neue URL als solche

ajax = { 
    url: url, 
    data: function (d){      
     d.value = value; 
    } 
}; 

table.ajax.loadOnce(ajax); 
Verwandte Themen