2012-06-13 9 views
13

Sto utilizzando l'ultima versione di jQuery datatables. Esiste una funzione di callback che posso utilizzare solo dopo che i dati sono stati caricati e visualizzati nel datatable?Come determinare quando jQuery datatable viene creato e caricato con i dati

Possiedo un datatable che sto sperimentando in IE8. Ho 2 serie di dati che sto testando (di cui ne uso uno alla volta). Ho un array JavaScript e un insieme di dati che ottengo da una chiamata Ajax. Sto usando ASP.NET MVC 3.

configurazione che ottiene i suoi dati da una chiamata AJAX:

$('#banks-datatable').dataTable({ 
    "bProcessing": true, 
    "sAjaxSource": '/Administration/Bank/List', 
    "aoColumns": [ 
      { "sTitle": "Engine" }, 
      { "sTitle": "Browser" }, 
      { "sTitle": "Platform" }, 
      { "sTitle": "Version" }, 
      { "sTitle": "Grade" } 
    ], 
    "bAutoWidth": false, 
    "bFilter": false, 
    "bLengthChange": false, 
    "iDisplayLength": 10 
}); 

alert('test'); 

Quando il mio datatable viene caricato in questo modo si crea DataTable (senza dati) e la scatola di elaborazione visualizza e il display pop-up di avviso. A questo punto il datatable è lì ma non sono stati caricati dati nel datatable. Solo quando il popup scompare (quando faccio clic sul pulsante Ok nel popup), i dati vengono caricati nel datatable. Perchè è questo?

configurazione che ottiene i suoi dati da un array JavaScript:

var aDataSet = [ 
    ['Trident', 'Internet Explorer 4.0', 'Win 95+', '4', 'X'], 
    ['Trident', 'Internet Explorer 5.0', 'Win 95+', '5', 'C'], 
    ['Trident', 'Internet Explorer 5.5', 'Win 95+', '5.5', 'A'], 
    ['Trident', 'Internet Explorer 6', 'Win 98+', '6', 'A'], 
    ['Trident', 'Internet Explorer 7', 'Win XP SP2+', '7', 'A'], 
    ['Trident', 'AOL browser (AOL desktop)', 'Win XP', '6', 'A'], 
    ['Gecko', 'Firefox 1.0', 'Win 98+/OSX.2+', '1.7', 'A'] 
]; 

$('#banks-datatable').dataTable({ 
    "aoColumns": [ 
      { "sTitle": "Engine" }, 
      { "sTitle": "Browser" }, 
      { "sTitle": "Platform" }, 
      { "sTitle": "Version" }, 
      { "sTitle": "Grade" } 
    ], 
    "bAutoWidth": false, 
    "bFilter": false, 
    "bLengthChange": false, 
    "iDisplayLength": 10, 
    "aaData": aDataSet 
}); 

alert('test'); 

DataTable viene creato e dati vengono caricati e poi fa solo il display pop-up. Questo è diverso dal primo scenario. Perché è così?

Se vado con il primo scenario, c'è un modo per determinare quando il datatable è stato creato e caricato con i dati?

Con questo controllo vorrei che fosse generale in modo che possa essere utilizzato in qualsiasi modo decido di caricarlo con i dati.

+0

avete provato '.ajaxSucess'? – undefined

+0

No non ancora, ma ce n'è uno più generale che posso usare a prescindere se ottiene i suoi dati da una chiamata Ajax o semplicemente da un semplice array JavaScript? –

+0

sì, hai ragione, recupera i dati da un array, puoi provare i metodi ['promise()'] (http://api.jquery.com/promise/) e 'done()'. – undefined

risposta

11

È possibile utilizzare la funzione fnDrawCallback. Viene chiamato ogni volta che viene disegnata la tabella. Ciò includerebbe quando la tabella viene caricata con dati, ordinata o filtrata.

+1

Questo ha funzionato per me. Chiama questa funzione a prescindere dal fatto che io usi dati provenienti da un array JavaScript o da una chiamata Ajax. Grazie. –

+0

Tuttavia è necessaria una variabile aggiuntiva se si desidera solo l'evento "onload". –

2

Ho sempre saputo che javascript è a thread singolo. Ecco un post per sostenere che:

Is JavaScript guaranteed to be single-threaded?

Nel primo scenario si stanno ottenendo i dati dal server, e poi tenendo il filo con una finestra di avviso. Nel secondo scenario si pre-popolano i dati. Credo che sia la differenza.

Questa pagina mostra come chiamare una richiamata in caso di successo:

http://datatables.net/usage/callbacks#fnServerData

// POST data to server 
$(document).ready(function() { 
    $('#example').dataTable({ 
    "bProcessing": true, 
    "bServerSide": true, 
    "sAjaxSource": "xhr.php", 
    "fnServerData": function (sSource, aoData, fnCallback) { 
     $.ajax({ 
     "dataType": 'json', 
     "type": "POST", 
     "url": sSource, 
     "data": aoData, 
     "success": fnCallback 
     }); 
    } 
    }); 
}); 
20

È meglio utilizzare fnInitComplete:

$(document).ready(function() { 
    $('#example').dataTable({ 
     "fnInitComplete": function (oSettings, json) { 
      alert('DataTables has finished its initialisation.'); 
     } 
    }); 
}) 
+0

Grazie, proprio quello che dovevo acquisire quando i dati AJAX erano stati recuperati e la GUI aggiornata. – 1DMF

+0

Una nuova versione di DataTables 1.10 è stata rilasciata con un'API leggermente modificata. Lista di richiamata: http://datatables.net/reference/option/ – Xdg

+0

Sto usando 1.10 e quanto sopra funziona perfettamente. – 1DMF

0

È anche possibile utilizzare DATASRC come remplacement per "il successo" dal momento che non dovrebbe essere sovraccaricato:

Qui con l'esempio tipico dei datatables.net

var table = $('#example').DataTable({ 
    "ajax": { 
      "type" : "GET", 
      "url" : "ajax.php", 
      "dataSrc": function (json) { 
       //Make your callback here. 
       alert("Done!"); 
       return json.data; 
       }  
      }, 
    "columns": [ 
      { "data": "name" }, 
      { "data": "position" }, 
      { "data": "office" }, 
      { "data": "extn" }, 
      { "data": "start_date" }, 
      { "data": "salary" } 

     ] 
    }); 
6

Sulla nuova versione di DataTable JQuery, il metodo viene chiamato: InitComplete

https://datatables.net/reference/option/initComplete

+0

Perfetto! Stavo cercando di attivare una funzione per compilare i badge associati alle schede contenenti specifici datatables e continuavo a ottenere conteggi zero, poiché il codice stava sparando prima che tutti i dati fossero recuperati (da ajax lato server). Questa chiamata ha ritardato quella chiamata di funzione fino a quando tutti i dati erano tornati. – ScottLenart

Problemi correlati