单击按钮时更新数据表(JQuery)

时间:2012-04-15 08:18:40

标签: jquery jquery-datatables

我创建了一个简单的表单,我使用Datatables jQuery插件在其中显示一些数据。数据由php脚本(process.php)填充,该脚本以JSON格式返回正确的结果。在表单中,有一个按钮,将文本框的值发送到process.php。 问题是,当单击按钮时,我无法使用process.php脚本收到的新数据更新/更改数据表。

表格的代码:

<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> 

要创建数据表,我使用以下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();
                }  
            });
        });
    } );

process.php脚本(工作正常)是:

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

5 个答案:

答案 0 :(得分:4)

fnReloadAjax是您应该使用的(我相信它可能会在函数中内置重绘)。但问题在于,尽管您进行了第二次.ajax调用,但该调用中的数据根本与您的数据表无关,并且永远不会绑定到它。

使用fnReloadAjax将进行您在表初始化中指定的相同Ajax调用。因此,正如Stefan所提到的,您需要在数据表设置中指定fnServerData参数(但不包括Success参数,因为数据表已经假定了这些行中的某些内容。然后只需按下fnReloadAjax()按钮即可。

以下是您的最终代码应该是什么样的:

$(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 :(得分:3)

最后,我找到了解决方案!我的JQuery代码中有2个问题:

  1. 我必须在加载数据表的脚本标记之后和$(document).ready()语句之前添加fnReloadAjax()代码。
  2. 我不得不改变提交按钮的JQuery代码(不需要AJAX调用,只需要fnReloadAjax())。
  3. 谢谢Stefan&amp; mbeasley !!

    JQuery代码现在是:

    //
    // 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());
            });
    
        } );
    

答案 2 :(得分:1)

看起来你应该在设置数据时指定fnServerData,如果你想使用ajax POST:http://datatables.net/ref#fnServerData

您也可以不需要拨打fnReloadAjax(),而只需拨打fnDraw()fnReloadAjax()是一个插件函数,所以我假设您之前已加载它。

答案 3 :(得分:0)

您也可以破坏表格并重新创建它。

var oTable = null;

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

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

reloadTable();

答案 4 :(得分:0)

您可以使用。

otable.ajax.reload()