8

我创建了一个简单的表单,并使用 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;
?>
4

5 回答 5

4

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

UsingfnReloadAjax将进行与您在表初始化中指定的相同的 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();
    });
} );
于 2012-04-15T12:54:08.833 回答
3

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

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

谢谢斯特凡和姆比斯利!!

现在的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());
        });

    } );
于 2012-04-15T18:04:17.307 回答
1

fnServerData如果您想使用 ajax POST,您还应该在设置数据表时指定:http: //datatables.net/ref#fnServerData

您也可能不需要调用fnReloadAjax(),而只需调用fnDraw()fnReloadAjax()是一个插件函数,所以我假设你之前加载过它。

于 2012-04-15T09:01:29.630 回答
0

您也可以只销毁表并重新创建它。

var oTable = null;

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

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

reloadTable();
于 2013-04-10T21:18:16.780 回答
0

您可以使用。

otable.ajax.reload()

于 2018-08-22T17:28:57.197 回答