Update datatables (JQuery) when button is clicked

后端 未结 5 1497
遇见更好的自我
遇见更好的自我 2021-02-09 01:37

I\'ve created a simple form and I\'m using the Datatables jQuery plugin to display some data in it. Data are being populated by a php script (process.php) which returns the prop

相关标签:
5条回答
  • 2021-02-09 02:16

    It looks like you should also specify fnServerData when you setup your datable, if you want to use ajax POST: http://datatables.net/ref#fnServerData

    It's also possible that you don't need to call fnReloadAjax(), but only fnDraw(). fnReloadAjax() is a plugin function, so I assume you did previously load it.

    0 讨论(0)
  • 2021-02-09 02:19

    fnReloadAjax is what you should use (and I believe that it might have a redraw built into the function). But the problem is that, although you make a second .ajax call, the data in that call is not associated with your datatable at all and will never be bound to it.

    Using fnReloadAjax will make the same Ajax call that you specified in your table initialization. So what you need, as Stefan mentioned, is to specify your fnServerData parameter in your datatable settings (but trash the Success parameters, because something along those lines is already assumed by datatables). Then just make your button call fnReloadAjax().

    Here's what your final code should look like:

    $(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();
        });
    } );
    
    0 讨论(0)
  • 2021-02-09 02:26

    You could alternatively just destroy the table and recreate it too.

    var oTable = null;
    
    function reloadTable() {
        if (oTable) {
            oTable.fnDestroy();
        }
    
        oTable = $('#example').dataTable( {
            "sPaginationType": "full_numbers",
            "iDisplayLength": 10,
            //"bServerSide": true,
            "sAjaxSource": "process.php"
        } );
    }
    
    reloadTable();
    
    0 讨论(0)
  • 2021-02-09 02:31

    you can use.

    otable.ajax.reload()

    0 讨论(0)
  • 2021-02-09 02:36

    At last, I found the solution! There were 2 problems in my JQuery code:

    1. I had to add the fnReloadAjax() code after the script tags which load datatables and before the $(document).ready() statement.
    2. I had to alter the JQuery code of my submit button (no need for an AJAX call, only fnReloadAjax() is necessary).

    Thank you both Stefan & mbeasley!!

    JQuery code now is:

    //
    // 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 讨论(0)
提交回复
热议问题