2012-04-15 13 views
8

Utworzono prosty formularz i używam wtyczki jQuery Datatables, aby wyświetlić niektóre dane w nim. Dane są zapełniane przez skrypt php (process.php), który zwraca prawidłowe wyniki w formacie JSON. W formularzu znajduje się przycisk, który wysyła wartość pola tekstowego do process.php. Problem polega na tym, że nie mogę aktualizować/zmieniać datatable z nowymi danymi otrzymanymi przez skrypt process.php po kliknięciu przycisku.Aktualizacja danych (JQuery) po kliknięciu przycisku

kod w postaci:

<form name="myform" id="myform" action="" method="POST"> 
    <label for="id">Enter an id:</label> 
    <input type="text" name="txtId" id="txtId" value=""/> 
    <input type="button" id="btnSubmit" name="btnSubmit" value="Search"> 
</form> 

<div id="results"> 
    <table class="display" id="example"> 
     <thead> 
      <tr> 
       <th>id</th> 
       <th>Surname</th> 
       <th>Name</th> 
      </tr> 
     </thead> 
     <tbody> 
      <!-- data goes here --> 
     </tbody> 
    </table> 
</div> 

Aby utworzyć DataTable, używam następujący kod jQuery:

$(document).ready(function() { 
      var oTable = $('#example').dataTable({ 
       "sPaginationType": "full_numbers", 
       "iDisplayLength": 10, 
       //"bServerSide": true, 
       "sAjaxSource": "process.php" 
      }); 

     $("#btnSubmit").click(function(){ 
      $.ajax({ 
       type: "POST", 
       url: "process.php", 
       data: 'txtId=' + $("txtId").val(), 
       success: function(result) { 
        oTable.fnReloadAjax(); 
        oTable.fnDraw(); 
       } 
      }); 
     }); 
    }); 

skrypt process.php (działa poprawnie) to:

<?php 
$result=""; 
if (empty($_REQUEST["txtId"])) {  
    $result = '{"aaData":[["1","Surname1","Name1"]]}'; 
} 
else { 
    $result = '{"aaData":[["2","Surname2","Name2"]]}'; 
} 
print $result; 
?> 
+1

** nigdy ** tworzenie JSON za pomocą funkcji ciąg. PHP ma 'json_encode()'.W twoim przypadku użyłbyś 'echo json_encode (array ('aaData' => array (array ('1', 'Surname1', 'Name1'))));' – ThiefMaster

+0

Tak, wiem o json_encode() funtion . Powyższy skrypt process.php został napisany ze względów prostotowych. Dzięki, ThiefMaster! – dimmat

Odpowiedz

1

Wygląda na to, że powinieneś również podać fnServerData podczas konfiguracji swojego zbioru danych, jeśli chcesz używać ajax POST: http://datatables.net/ref#fnServerData

Jest również możliwe, że nie trzeba dzwonić pod numer fnReloadAjax(), ale tylko fnDraw(). fnReloadAjax() jest funkcją wtyczki, więc zakładam, że wcześniej ją wczytałeś.

+0

Wygląda na to, że nie załadowałem wtyczki fnReloadAjax(). Skopiowałem/wkleiłem kod wtyczki na początku mojego skryptu JQuery, ale nic się nie stało. Spróbuję jeszcze raz, a spróbuję fnServerData. Dzięki Stefan! – dimmat

+0

W końcu znalazłem rozwiązanie! W moim kodzie JQuery wystąpiły 2 problemy. Najpierw musiałem dodać kod fnReloadAjax() po znacznikach , który ładuje elementy danych i przed instrukcją $ (document) .ready(). Po drugie, musiałem zmienić kod JQuery mojego przycisku wysyłania (nie ma potrzeby wywoływania AJAX, konieczne jest tylko fnReloadAjax()). Jeszcze raz dziękuję, Stefan. Dobra robota!! – dimmat

+0

@dimmat: Nie ma za co. Więc oprócz braku konieczności wywoływania funkcji .ajax(), czy mówisz, że nie musisz również podawać 'fnServerData'? (W takim przypadku GET jest używany do automatycznego przekazywania twojego parametru "txtId" do twojego skryptu). Również znalazłem odpowiedź mbeasleya, aby była bardzo pouczająca i być może powinna to być akceptowana odpowiedź. – Stefan

4

fnReloadAjax jest tym, czego powinieneś używać (i uważam, że może mieć przerysowanie wbudowane w funkcję). Problem polega jednak na tym, że pomimo tego, że wykonujesz drugie wywołanie .ajax, dane w tym wywołaniu nie są w ogóle powiązane z twoimi datatable i nigdy nie będą z nimi związane.

Użycie fnReloadAjax wykona to samo wywołanie Ajax, określone w inicjalizacji tabeli. Potrzebne jest, jak wspomniał Stefan, określenie parametru fnServerData w ustawieniach datowalnych (ale wyrzucenie parametrów Success, ponieważ coś wzdłuż tych linii jest już uwzględnione w datatables). Następnie wystarczy zadzwonić pod numer fnReloadAjax().

Oto co twój ostateczny kod powinien wyglądać następująco:

$(document).ready(function() { 
     var oTable = $('#example').dataTable({ 
      "sPaginationType": "full_numbers", 
      "iDisplayLength": 10, 
      "sAjaxSource": "process.php", 
      "fnServerData": function (sSource, aoData, fnCallback) { 
       $.ajax({ 
        "dataType": 'json', 
        "type": "POST", 
        "url": sSource, 
        "data": 'txtId=' + $("txtId").val(), 
        "success": fnCallback 
       }); 
      } 
     }); 

    $("#btnSubmit").click(function(){ 
     oTable.fnReloadAjax(); 
    }); 
}); 
+1

To jest świetne wyjaśnienie. Wygląda więc na to, że może nie być nawet konieczne użycie 'fnServerData', jeśli nie nalegasz na używanie POST do przekazania parametrów skryptowi - ponieważ domyślnie użyjesz GET. – Stefan

+0

Twój kod wygląda na prawidłowy, ale nie zadziałał. Rozwiązałem ten problem, dodając kod API wtyczki fnReloadAjax() (znajdujący się w http://www.datatables.net/plug-ins/api) po tagach skryptu ładujących zbiory danych i przed funkcją $ (document) .ready() . Zmieniłem również kod jquery mojego przycisku przesyłania: $ ("# btnSubmit"). Click (function() { oTable.fnReloadAjax ("process.php? TxtId =" + $ ("txtId"). Val()); }); Dzięki! – dimmat

+0

Idealny! Jeśli użyjesz fnReloadAjax określając nowe źródło dla kliknięcia przycisku, fnServerData nie jest potrzebna. Cieszę się, że to działa. – mbeasley

3

W końcu znalazłem rozwiązanie! Były 2 problemy w moim kod jQuery:

  1. musiałem dodać fnReloadAjax() kod po tagach, które ładują DataTables i przed $ (document) .ready() oświadczenie skryptów.
  2. Musiałem zmienić kod JQuery mojego przycisku przesyłania (nie trzeba wywoływać AJAX, konieczne jest tylko fnReloadAjax()).

Dziękuję zarówno Stefan & mbeasley !!

kod jQuery jest teraz:

// 
// fnReloadAjax() code  
// 
    $.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, fnCallback, bStandingRedraw) 
    { 
     if (typeof sNewSource != 'undefined' && sNewSource != null) 
     { 
      oSettings.sAjaxSource = sNewSource; 
     } 
     this.oApi._fnProcessingDisplay(oSettings, true); 
     var that = this; 
     var iStart = oSettings._iDisplayStart; 
     var aData = []; 

     this.oApi._fnServerParams(oSettings, aData); 

     oSettings.fnServerData(oSettings.sAjaxSource, aData, function(json) { 
      /* Clear the old information from the table */ 
      that.oApi._fnClearTable(oSettings); 

      /* Got the data - add it to the table */ 
      var aData = (oSettings.sAjaxDataProp !== "") ? 
       that.oApi._fnGetObjectDataFn(oSettings.sAjaxDataProp)(json) : json; 

      for (var i=0 ; i<aData.length ; i++) 
      { 
       that.oApi._fnAddData(oSettings, aData[i]); 
      } 

      oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); 
      that.fnDraw(); 

      if (typeof bStandingRedraw != 'undefined' && bStandingRedraw === true) 
      { 
       oSettings._iDisplayStart = iStart; 
       that.fnDraw(false); 
      } 

      that.oApi._fnProcessingDisplay(oSettings, false); 

      /* Callback user function - for event handlers etc */ 
      if (typeof fnCallback == 'function' && fnCallback != null) 
      { 
       fnCallback(oSettings); 
      } 
     }, oSettings); 
    } 


    $(document).ready(function() { 

     var oTable = $('#example').dataTable({ 
      "sPaginationType": "full_numbers", 
      "iDisplayLength": 10, 
      //"bServerSide": true, 
      "sAjaxSource": "process.php" 
     }); 

     $("#btnSubmit").click(function(){ 
      oTable.fnReloadAjax("process.php?txtId=" + $("txtId").val()); 
     }); 

    }); 
0

Mogłeś alternatywnie po prostu zniszczyć tabelę i utwórz ją też.

var oTable = null; 

function reloadTable() { 
    if (oTable) { 
     oTable.fnDestroy(); 
    } 

    oTable = $('#example').dataTable({ 
     "sPaginationType": "full_numbers", 
     "iDisplayLength": 10, 
     //"bServerSide": true, 
     "sAjaxSource": "process.php" 
    }); 
} 

reloadTable(); 
Powiązane problemy