【问题标题】:datatables and server-side processing - load on demand数据表和服务器端处理 - 按需加载
【发布时间】:2013-04-18 14:44:33
【问题描述】:

我已经使用 DataTables 构建了简单的表,并且我成功连接了服务器端脚本以使用数据填充我的表。

在我的表格上方,我有 2 个复选框和 2 个日期选择来指定过滤条件。 当我的页面加载时,我的表格被填满,因为在启动时数据表正在从服务器拉取第一页数据。

我想禁用第一次初始数据加载,所以当页面加载时我会得到空表,然后在我选择条件并按“加载”按钮后将加载数据。

我知道如何将过滤条件添加到服务器参数,我需要做的是在用户单击按钮后从服务器加载数据。

下面是我的数据表脚本:

var myTable= $('table#myTable').dataTable({
    "table-layout": "fixed",
    "bJQueryUI": true,
    "sDom": '<"H"lpr>t<"F"ip>',
    "iDisplayLength": 25,
    "aLengthMenu": [[25, 50, 100, 500], [25, 50, 100, 500]],
    "bSort": false,
    "sPaginationType": "full_numbers",
    "bPaginate": true,
    "bProcessing": true,
    "bServerSide": true,
    "sAjaxSource": "Data.asmx/Sales",
    "fnServerData": function(sSource, aoData, fnCallback) {
        var sEcho = aoData[0].value;
        var iDisplayStart = aoData[3].value;
        var iDisplayLength = aoData[4].value;

        $.ajax({
            contentType: "application/json; charset=utf-8",
            type: "POST",
            url: sSource,
            //below are my parameters
            data: "{'sEcho': '" + sEcho
                + "','iDisplayStart': '" + iDisplayStart
                + "','iDisplayLength': '" + iDisplayLength
                + "'}",
            success: function(msg) {
                fnCallback(msg.d);
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.status);
                alert(XMLHttpRequest.responseText);
            }
        });
    },
    "bAutoWidth": false,
    "aoColumns": [{
            "sType": "numeric",
            "mData": "Nr",
            "sWidth": "50px"
        }, {
            "sType": "string",
            "mData": "Name"
        }, {
            "sType": "string",
            "mData": "Surname"
        }]
});

【问题讨论】:

    标签: javascript jquery-datatables


    【解决方案1】:

    您只需为数据表指定 iDeferLoading 参数,其中包含您的表在 DOM 中已包含的记录数,如果没有记录,则为 0。

    $(document).ready(function() {
    $('#example').dataTable( {
        "bProcessing": true,
        "bServerSide": true,
        "sAjaxSource": "scripts/server_processing.php",
        "iDeferLoading": 0
    } );
    } );
    

    【讨论】:

    • 谢谢!我没有意识到我可以在这种情况下使用它:)
    【解决方案2】:

    在需要表格之前不要调用.dataTable() 方法。示例如下:

    var myTable = null,
        dtOptions = {
            "table-layout": "fixed",
            "bJQueryUI": true,
            //...rest of options...
        };
    
    $('#button').click(function (e) {
        myTable = $('table#myTable').dataTable(dtOptions);
    });
    

    或者,如果您在表初始化后不需要访问选项:

    $('#button').click(function (e) {
        myTable = $('table#myTable').dataTable({
            "table-layout": "fixed",
            "bJQueryUI": true,
            "sDom": '<"H"lpr>t<"F"ip>',
            "iDisplayLength": 25,
            "aLengthMenu": [[25, 50, 100, 500], [25, 50, 100, 500]],
            "bSort": false,
            "sPaginationType": "full_numbers",
            "bPaginate": true,
            "bProcessing": true,
            "bServerSide": true,
            "sAjaxSource": "Data.asmx/Sales",
            "fnServerData": function(sSource, aoData, fnCallback) {
                var sEcho = aoData[0].value;
                var iDisplayStart = aoData[3].value;
                var iDisplayLength = aoData[4].value;
    
                $.ajax({
                    contentType: "application/json; charset=utf-8",
                    type: "POST",
                    url: sSource,
                    //below are my parameters
                    data: "{'sEcho': '" + sEcho
                        + "','iDisplayStart': '" + iDisplayStart
                        + "','iDisplayLength': '" + iDisplayLength
                        + "'}",
                    success: function(msg) {
                        fnCallback(msg.d);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        alert(XMLHttpRequest.status);
                        alert(XMLHttpRequest.responseText);
                    }
                });
            },
            "bAutoWidth": false,
            "aoColumns": [{
                    "sType": "numeric",
                    "mData": "Nr",
                    "sWidth": "50px"
                }, {
                    "sType": "string",
                    "mData": "Name"
                }, {
                    "sType": "string",
                    "mData": "Surname"
                }]
        });
    });
    

    【讨论】:

    • 其实我从一开始就想要表格,但里面没有任何数据。我设法在fnServerData 中解决了这个问题-当第一个请求完成并且 sEcho==1 我只是调用 fnCallback 但数据集为空。这在开始时给了我空表,然后当我想加载数据时,我在按钮单击处理程序中调用 fnDraw(false)
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2016-06-21
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多