2016-06-10 18 views
1

Ich verwende datatables, um mehrere Informationen und Schaltfläche anzuzeigen. Dies ist die JavaScript verwendet, um die DatentabellenDatatables aktualisieren einzelne Spalte alle 5 Sekunden

if (! $.fn.DataTable.isDataTable('#datatableTable')) { 
     datatableTable = $('#datatableTable').DataTable({ 
      responsive: true, 
      columnDefs: [ 
         { "width": "25%", "targets": 4}, 
         { 
          targets: [4,5,6], 
          //set priority to column, so when resize the browser window this botton stay on the screen because have max priority 
          visible: (document.getElementById('role').value == '[ROLE_ADMIN]' || document.getElementById('role').value == '[ROLE_FLEET_ENG]' 
           || document.getElementById('role').value == '[ROLE_SUPPLIER]'), 
          responsivePriority: 1, 
          orderable: false, 
          searchable: false, 
         }, 
         ... 
         ], 
         //fix problem with responsive table 
         "autoWidth": false, 
         "ajax":{ 
          "url": "datatable/" + $("#selectedCar").val(), 
          "dataSrc": ... 
            return json.result.data;            
          }, 
          "error": function (xhr, error, thrown) { 
           window.location.href = "/DART/500"; 
          } 
         }, 
         "columns": [ 
            .... 
            {data:null, render: function (data, type, row) { 
             var datId="deleteDat"+row.idAcquisition; 
             if (row.datUploaded){ 
              return '<button type="button" class="btn btn-danger" name="deleteDat" target="'+row.idAcquisition+'" id="'+datId+'" data-toggle="modal"' 
              +'data-target="#deleteDatModal">Delete</button>' 
             }else 
              return '<button type="button" class="btn btn-danger" name="deleteDat" target="'+row.idAcquisition+'" id="'+datId+'" data-toggle="modal"' 
              +'data-target="#deleteDatModal" disabled>Delete</button>'           
            }, 
            ], 
            "fnDrawCallback": function(data, type, row, meta) { 
             //Initialize checkbox for enable/disable user 
             $("[name='my-checkbox']").bootstrapSwitch({size: "small", onColor:"success", offColor:"danger"}); 
            }, 
     }); 
    } 
    else { 
     datatableTable.ajax.url("datatable/" + $("#selectedCar").val()).load(); 
    } 

Spalte 5 (beginnend bei 0) hat Tasten zu initialisieren, kann jede Taste hängt von dem datUploaded Booleschen Wert gesperrt oder freigegeben werden. Diese Variable ändert sich, wenn der Benutzer die Datei lädt, aber dieser Wert ist nach der asynchronen Aufgabe eingestellt, so dass ich in meinem Javascript nicht weiß, wann diese Aufgabe endet.

Ich dachte, alle 5 Sekunden nur diese Spalte zu aktualisieren, aber wie kann ich es tun? Ich finde datatableTable.column(5).cells().invalidate().render(), aber ich erhalte einen Fehler (unknow Parameter "isShow" für Zeile 0) und Update funktioniert nicht. Können Sie mir helfen? Danke

+0

Könnten Sie bitte Ihren Beispielcode zum eigentlichen problematischen Teil Streifen nach unten (s) – fast

+0

Nun ist besser? Ich denke, das Problem ist sowohl "FnDrawCallback" und Anweisungen zum Aktualisieren der Spalte – luca

+0

Sie sagen "nach async Aufgabe eingestellt, so dass ich nicht in meinem Javascript, wenn diese Aufgabe zu Ende wissen", aber Sie können .load() einen Rückruf an ausgeführt werden, nachdem der Ajax-Anruf beendet wurde, so können Sie tatsächlich wissen, wenn die Aufgabe über – lud1977

Antwort

0

Wie ich in einem Kommentar gesagt habe, können Sie .load() eine Callback-Funktion übergeben, die automatisch aufgerufen wird, wenn die Ajax-Anfrage abgeschlossen ist. In diesem Callback können Sie Ihre Tabelle nach Belieben aktualisieren. Vergessen Sie nicht, nachdem Sie die Tabelle aktualisieren, datatableTable.draw(); aufzurufen, um die Änderungen zu übernehmen.

Ich glaube nicht, dass invalidate() und render() notwendig sind.

So Ihr else Zweig wäre so etwas wie

datatableTable.ajax.url("datatable/" + $("#selectedCar").val()).load(function() { 
    /* 
    ...do something to the table... 
    */ 

    datatableTable.draw(); 
}); 
+0

Async-Task (Spring) ist auf dem Server, sollte ich datatable.draw() alle 5 Sekunden aufrufen? Ich möchte nur diese Spalte und nicht alle Tabellen aktualisieren, ansonsten kann ich datatableTable.ajax.reload(); – luca

+0

Entschuldigung, ich gab von Ihnen, dass Sie sich auf den Ajax-Anruf bezogen haben. Ja, wenn die Aufgabe unabhängig vom Skript parallel auf dem Server ausgeführt wird, müssen Sie den Server nach den Ergebnissen abfragen. Haben Sie eine URL, die Sie anrufen können, um die aktualisierten Informationen zu erhalten? – lud1977

+0

Ich habe URL für die ganze Tabelle, das Update ist datUploaded zu wahr oder falsch. Ich kann die gesamte Tabelle nicht aktualisieren, da der Benutzer Informationen laden oder andere Vorgänge ausführen kann – luca

Verwandte Themen