2017-08-24 1 views
1

Also, für meine Datentabelle, ich brauche einige Ajax-Aufrufe zu tun, und die Tabelle mit den zurückgegebenen Informationen neu zu zeichnen, aber ich hatte einige Probleme ....jQuery Tables: Aufruf draw() innerhalb Initcomplete

Ich versuchte, die Ajax-Aufrufe innerhalb des Datatable-Event „drawCallback“, und rufen Sie die Funktion ziehen(), wenn die Anrufe abgeschlossen, aber auf die Ausführung zu tun, wurde das Ereignis endlos, bis der Browser abgestürzt feuern. Ich denke, es liegt daran, dass das Ereignis „drawCallback“ nach dem Aufruf Unentschieden abgefeuert wird() (es für mich jetzt scheint offensichtlich, aber ich habe es nicht erkennen, wenn ich es Codierung).

Also, meine Frage ist, wenn ich versuche, die gleichen Ajax-Aufrufe (und hinteren draw() Anrufe) innerhalb der Veranstaltung „Initcomplete“ zu tun, anstatt mit „drawCallback“, wird die draw() function das Ereignis "initComplete" erneut auslösen? (und daraus ergibt sich wieder eine Endlosschleife)

EDIT: Ich habe vergessen zu erwähnen, dass ich ein Java-Servlet als Server verwende, wo die Ajax-Anrufe gerichtet sind. Hier ist die Datentabelle Code:

(ja, ich bin mit Scriptlets hier, ich bin ein Monster)

$("#dtExample").DataTable({ 
    data: <%= lGastosJson %>, 
    columns: [ 
     {data: 'idGasto'}, 
     {data: 'fecha'}, 
     {data: 'descripcion'}, 
     {data: 'projectDescription'}, 
     {data: 'descrTipoGasto'}, 
     {data: 'costoTotalEuro'}, 
     {data: 'nombreAdjunto', 
     defaultContent: ''} 
    ], 
    columnDefs: [ 
     // ... 
    ], 
    drawCallback: function(settings){ 
     var tableData = this.api().rows().data(); 
     var redraw = false; 
     var self = this; 

     for (var i=0;i<tableData.length;i++){ 
     //This column may be empty, I'm only doing the ajax call if it is NOT empty 
     if (typeof tableData[i]['nombreAdjunto'] !== 'undefined'){ 
      var output = ""; 

      $.ajax({ 
       url: '<%= contextPath %>/AsincronasServlet', 
       data: {command: "getAttachPhotos", username: "<%= user %>", adjunto: tableData[i]['nombreAdjunto'], index: i}, 
       success: function(result){ 
       console.log(result); 
       var resultParams = result.split("@"); 
       var error = false; 
       var index = -1; 
       for (var j=0; j<resultParams.length; j++){ 
        if (resultParams[j].substring(0,5) === "error"){ 
         error = true; 
        } 
        if (resultParams[j].substring(0,5) === "index"){ //el indice se necesita tanto en success como en error 
         var idxPar = resultParams[j].split(":"); 
         index = idxPar[1]; 
        } 
       } 

       //The idea is using this if-else to change the inner HTML of the column and then redraw 
       if (error){ 
        output = "<span class='fa fa-search fa-2x previewError' aria-hidden='true' title='Error al cargar la imagen'></span>"; 
        tableData[index]['nombreAdjunto'] = output; 
       } else { 
        //haven't coded this yet       
       } 

       self.api().rows().draw(); 
      } 
     }); 
    } 
}}}); 

Vielen Dank im Voraus!

+0

„* aber bei der Ausführung wurde das Ereignis endlos ausgelöst, bis der Browser abstürzte * "Ein echter Stapelüberlauf :). Sie verwenden die Auslosung Rückruf, um die Tabelle zu aktualisieren, die die Auslosung Rückrufe, die die Tabelle aktualisiert und so weiter ... Neben diesem nicht besonders beantwortbar ohne einige Codes - was Sie versuchen, genau das zu tun ..? – davidkonrad

Antwort

0

Ich schlage vor, Sie tun die Manipulation im Voraus, nicht nach Tabelle Initialisierung. Sie können eine Funktion an Daten übergeben und in dieser Funktion die AJAX-Schleife ausführen. Sehr schematisch, nicht so, wie ich Ihren Code reproduzieren:

function dataCallback(tableData) { 
    for (var i=0;i<tableData.length;i++){ 
    ... 
    ... 
    if (i == tableData.length-1) { 
     return tableData 
    } 
    } 
} 

in der Datatable Initialisierung:

data: dataCallback(<%= lGastosJson %>), 

Proof-of-Concept, können die Daten auf diese Weise manipuliert werden ->http://jsfiddle.net/0f9Ljfjr/960/

+1

Ich mag diesen Ansatz, es reduziert die Anzahl der Ziehungen der Tabelle ausgeführt. Leider funktioniert es nicht für meinen Fall. Da ich die Informationen mit AJAX aktualisiere, und in den meisten Fällen muss ich mehr als einen Anruf tätigen, kann ich die Daten in der AJAX-Succes-Funktion nicht zurückgeben. Wie auch immer, Ihre Antwort ist sehr nützlich, da es viel sauberer ist den Inhalt vor der ersten Ziehung zu ändern, als es nach dem vollständigen tut es zeichnen und wieder neu zu zeichnen sind. Vielen Dank! : D – Paul

+0

@Paul, deshalb habe ich vorgeschlagen 'if (i == tableData.length-1) {', Sie können nicht von ajax success zurückkommen, aber Sie können von 'for (var i = 0; i davidkonrad

+0

Statt ein kleines Timeout hinzuzufügen, wäre es nicht einfacher sein, die AJAX Einstellung ruft = false Asynchron? – Paul

Verwandte Themen