2015-02-04 8 views
5

Ho il seguente codice sotto DT v1.10:DataTable() ajax.reload() non definito

var oTable = $('#items') 
    .dataTable({ 
     sDom: "<'row'<'col-md-4'l><'col-md-6'f>r>t<'row'<'col-md-4'i><'col-md-7'p>>", 
     oLanguage: { 
      sLengthMenu: "_MENU_ per page" 
     }, 
     ajax: "/items", 
     bProcessing: true, 
     bServerSide: true, 
     aoColumnDefs: [ 
      { 
       aTargets: [-1], 
       bSearchable: false, 
       bSortable: false 
      } 
     ] 
    }) 
    .on('click', '.btn-danger', function (e) { 
     if (confirm('Are you sure you want to delete SKU "' + $(this).data('sku') + '"?')) { 
      $.getJSON($(this).attr('href'), function (data) { 
       if ('success' in data) { 
        oTable.ajax.reload(null, false); 
       } 
      }); 
     } 
     event.stopPropagation(); 
     return false; 
    }); 

Quando il server risponde con successo, tenta di chiamare la linea oTable.ajax.reload(null, false); ma ottengo sempre l'errore Uncaught TypeError: Cannot read property 'reload' of undefined

Cosa sto facendo di sbagliato qui?

risposta

18

Si sta utilizzando l'API precedente: $().dataTable() (v1.9 e precedenti), che è ancora disponibile in DataTables v1.10. La vecchia API restituisce oggetto jQuery, quindi si dovrebbe utilizzare .api() al fine di utilizzare metodi API DataTable:

oTable.api().ajax.reload(); 

La nuova API viene restituito tramite: $().DataTable()

Datatables FAQ

Q .: Viene visualizzato un messaggio di errore che indica che un metodo API non è disponibile
A .: Molto probabilmente si ar e utilizzando un oggetto jQuery piuttosto che un'istanza API DataTables. Il modulo $().dataTable() restituirà un oggetto jQuery, mentre $().DataTable() restituisce un'istanza dell'API DataTables. Si prega di consultare la documentazione API per ulteriori informazioni.

API documentation

E 'importante notare la differenza tra $(selector).DataTable() e $(selector).dataTable(). Il primo restituisce un'istanza API DataTables, mentre il secondo restituisce un oggetto jQueryJS. Un metodo api() viene aggiunto all'oggetto jQuery in modo da poter accedere facilmente all'API, ma l'oggetto jQuery può essere utile per manipolare il nodo della tabella, come faresti con qualsiasi altra istanza di jQuery (come l'uso di addClass(), ecc.).

7

Come seguito della risposta di phillip100, non è necessario modificare tutto il vecchio codice o modificare il metodo di inizializzazione solo per utilizzare la nuova API. È sempre possibile ottenere i DataTable 1.10.x API al volo:

... 
if ('success' in data) { 
    //oTable.ajax.reload(null, false); 
    $('#items').DataTable().ajax.reload(null, false); 
} 
... 

sarebbe perfettamente bene. jQuery dataTables controlla se esiste già un'istanza dataTables di $("#items"), quindi non ci sarà ridondanza.

+0

Mille grazie per il seguito! Molto utile! :) – eComEvo