Datatables 1.10重新加载ajax数据

时间:2015-01-05 20:35:22

标签: jquery ajax datatables

我正在使用datatables 1.10尝试更改AJAX源以从服务器重新加载新数据,但是它继续使用相同的URL现在更改为新的URL。我是否也需要更改sSource以至于我不确定问题是什么。

 var oTable = $('#big_table').DataTable({
      'bProcessing'    : true,
      'bServerSide'    : true,
             "sDom": '<"toolbar"lfr>tip<"F">R',

      'sAjaxSource'    : 'myServer/oldURL',
             "columns": [],
      'sPaginationType': 'full_numbers',
             "aaSorting": [
                [5, "desc"]
            ],
      'bAutoWidth'     : false,
            'iDisplayLength': 15,
             "footerCallback": function ( row, data, start, end, display ) {
            var api = this.api(), data;
            var rowCount = oTable.rows()[0].length;

            // Update footer
            $( api.column( 6 ).footer() ).html(
                ' ( Cards:'+ rowCount +')'
            );
        },


      'fnServerData'   : function(sSource, aoData, fnCallback)
      {
        $.ajax({
          'dataType': 'json',
          'type'    : 'POST',
          'url'     : sSource,
          'data'    : aoData,
          'success' : fnCallback
        }); 
      }, 
}); 

重新载入数据

$("#change").click( function()
{
oTable.ajax.url('myServer/newURL').load();
});

myServer/oldURL

加载的数据

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题并找到了一个简单的解决方案。只需在数据部分中使用一个返回全局变量而不是纯变量的函数:

<script type="text/javascript">
    var cs = 0;
    var dtconfig = {
        "processing": true,
        "serverSide": true,
        "ordering": false,
        "info": true,
        "ajax": {
            "url": "/JournalData",
            "data": {
                selectedStation: function () { return window.cs; }
            }
        },
        "columns": [
            { "data": "ValueDate" },
            { "data": "StationText" },
            { "data": "DataPointText" },
            { "data": "ValueText" },
        ],
        "aoColumnDefs": [
        {
            "aTargets": [0], //indexes of whatever columns you need to format
            "mRender": function (data, type, full) {
                if (data) {
                    var mDate = moment(data).local();
                    //return (mDate && mDate.isValid()) ? mDate.format("L LT") : "";
                    return (mDate && mDate.isValid()) ? moment(mDate).locale("de").format('DD.MM.YY HH:mm:ss') : "";
                    //return mDate.toLocaleString();
                }
                return "";
            }
        }
        ]
    };

    $(document).ready(function () {
        $('#PaJournal').dataTable(dtconfig);
    });

    function UpdateStationFilter(StationId) {
        cs = StationId;
        var table = $('#PaJournal').DataTable();
        table.ajax.reload();
    }
</script>

现在我的DataTable重新加载了所需的数据,并且没有坚持初始值。

答案 1 :(得分:0)

谢谢,这是我的解决方案,它不完美,必须发送两次url,感谢这位作者:How do I modify ajax url of a query datatable?例如:如果你如果你初始化这样的数据表:

               var datatables_options = {
                                "aLengthMenu" : [ [ 5, 10, 50, 100,500, -1 ],[ 5, 10, 50, 100,500, "All" ] ],
                                "iDisplayLength" : 5,
                                //如下的sdom,1.9的版本会显示不出来,
                                "sDom": 'T<"clear">rt<"float_left"i><"float_right_nexpage"p><"float_right_display"l>',
                                //"sDom" : "<r>t<'float_left'i><'float_right_nexpage'p><'float_right_display'l>>",
                                // 第一列禁止排序,因为这是复选框,不需要排序
                                "bSort" : false,
                                "bProcessing" : false,
                                "bServerSide" : true,
                                "bStateSave" : true, //是否打开客户端状态记录功能,此功能在ajax刷新纪录的时候不会将个性化设定回复为初始化状态  
                                "bDestroy" : true,
                                "bDeferRender":true,//延迟加载html元素
                                "bJQueryUI" : false,
                                "sScrollX" : "100%",
                                "bStateSave":true,
                                "language" : oLanguageData,
                                // "aaData" : data,
                                "aoColumns" : aoColumnsData,
                                // 复选框点击下一页进行更新状态为未选中
                                "fnDrawCallback" : function() {//关键点:需要先去掉checkbox的父级div的类checker,因为这个会影响选中的显示效果
                                    $("#uniform-check-all").removeClass("checker");
                                    //切换下一页,去掉原来全选的checkbox的状态
                                    $("span").removeClass("checked");
                                    $("span #check-all").attr("checked",false);
                                   //更新表格
                                    $.uniform.update();
                                 },
                                "fnRowCallback" : function(nRow, aData,
                                        iDataIndex) {   

                                },
                                "sAjaxSource" : "wageQuery.action?wageDate="
                                        + date,
                                "fnServerData" : function(sSource, aoData,
                                        fnCallback) {
                                    $.ajax({
                                        "type" : 'post',
                                        "async":false,
                                        "url" : sSource,
                                        "dataType" : "json",
                                        "data" : aoData,
                                        "success" : function(resp) {
                                            fnCallback(resp);
                                        }

                                    });
                                },
                                "fixedColumns":   {
                                     "iLeftColumns" : 4,
                                     "sHeightMatch" : "auto"
                                },

                            };

import:如果你想重新加载新的url(动作),这里有解决方案:第一步:在JSP文件中初始化表变量,如下所示:

   <script type="text/javascript">

          var wageNowTable;//表格全局变量,不要放在ready函数内,否则就不是全局变量
       </script>

第二步:将以下代码添加到JS文件中,如下所示:

   $("#wages-query")
                .click(
                        function() {
                            var date = document.getElementById("wageDate").value;
                            if (date.length == 0) {
                                alert("请选择月份");
                                return;
                            }


                            var datatables_options = {
                                "aLengthMenu" : [ [ 5, 10, 50, 100,500, -1 ],[ 5, 10, 50, 100,500, "All" ] ],
                                "iDisplayLength" : 5,
                                //如下的sdom,1.9的版本会显示不出来,
                                "sDom": 'T<"clear">rt<"float_left"i><"float_right_nexpage"p><"float_right_display"l>',
                                //"sDom" : "<r>t<'float_left'i><'float_right_nexpage'p><'float_right_display'l>>",
                                // 第一列禁止排序,因为这是复选框,不需要排序
                                "bSort" : false,
                                "bProcessing" : false,
                                "bServerSide" : true,
                                "bStateSave" : true, //是否打开客户端状态记录功能,此功能在ajax刷新纪录的时候不会将个性化设定回复为初始化状态  
                                "bDestroy" : true,
                                "bDeferRender":true,//延迟加载html元素
                                "bJQueryUI" : false,
                                "sScrollX" : "100%",
                                "bStateSave":true,
                                "language" : oLanguageData,
                                // "aaData" : data,
                                "aoColumns" : aoColumnsData,
                                // 复选框点击下一页进行更新状态为未选中
                                "fnDrawCallback" : function() {//关键点:需要先去掉checkbox的父级div的类checker,因为这个会影响选中的显示效果
                                    $("#uniform-check-all").removeClass("checker");
                                    //切换下一页,去掉原来全选的checkbox的状态
                                    $("span").removeClass("checked");
                                    $("span #check-all").attr("checked",false);
                                   //更新表格
                                    $.uniform.update();
                                 },
                                "fnRowCallback" : function(nRow, aData,
                                        iDataIndex) {
                                    var temp = aData.number;
                                    var temp = aData.name;
                                    $('td:eq(0)', nRow).html(
                                            "<input type='checkbox' name='everyline'  class='checkboxes' value="
                                                    + aData.number
                                                    + "></input>");
                                    //由于固定列的原因,当名字超过一定长度,表格就显示错乱,需要限定3个汉字,用...表示
                                    if (GetLength(aData.name) > 6) {
                                        $('td:eq(2)', nRow).html(
                                                "<a style='cursor:pointer' onclick='toWagePerson(\""
                                                        + date + "\",\""
                                                        + aData.identification
                                                        + "\");'>" + cutstr(aData.name, 6)
                                                        + "</a> ");
                                    }else{
                                        $('td:eq(2)', nRow).html(
                                                "<a style='cursor:pointer' onclick='toWagePerson(\""
                                                        + date + "\",\""
                                                        + aData.identification
                                                        + "\");'>" + aData.name
                                                        + "</a> ");
                                    }



                                },
                                "sAjaxSource" : "wageQuery.action?wageDate="
                                        + date,
                                "fnServerData" : function(sSource, aoData,
                                        fnCallback) {
                                    $.ajax({
                                        "type" : 'post',
                                        "async":false,
                                        "url" : sSource,
                                        "dataType" : "json",
                                        "data" : aoData,
                                        "success" : function(resp) {
                                            fnCallback(resp);
                                        }

                                    });
                                },
                                "fixedColumns":   {
                                     "iLeftColumns" : 4,
                                     "sHeightMatch" : "auto"
                                },

                            };

                            // 设置固定前三列的功能
                            datatables_options["sScrollX"] = "100%";
                            datatables_options["sScrollY"] = "400px";
                            datatables_options["bScrollCollapse"] = true;
                            // datatables_options["sScrollXInner"] = '150%';

                            //判断表格是否已经实例化,没有则实例化,已经实例化,则直接更新,加载对应的url
                            if (typeof(wageNowTable) == "undefined") {
                                wageNowTable = $('#sample_1').dataTable(datatables_options);

                            }else{
                                var oSettings = wageNowTable.fnSettings();
                                oSettings.sAjaxSource = "wageQuery.action?wageDate="
                                    + date;
                                wageNowTable.fnDraw(false);//不会跳转到第一页,保留页面的页码和显示条数
                                wageNowTable.fnDraw(false);//不会跳转到第一页,保留页面的页码和显示条数
                            }


                            //  重要注意点:
                            //  2016年10月31日16:38:51:qiulinhe:固定列的复选框在查询数据之后更新状态
                                //重要一点:监听复选框的状态,重要需要使用on的形式,直接click无法改变状态
                            $('.DTFC_LeftHeadWrapper div').on('click','input' ,function () {
                                            $("#uniform-check-all").removeClass("checker");
                                            //切换下一页,去掉原来全选的checkbox的状态
                                            $("span").removeClass("checked");
                                            //表格绘制完成,监听全选的复选框按钮,将表格所有选中
                                                    //alert("全选的按钮事件");
                                                    var val = $(this).prop("checked");
                                                    $("input[type='checkbox']", ".DTFC_LeftHeadWrapper").attr("checked", val);

                                                    $("#check-all").attr("checked", val);
                                                    if (val) {
                                                        $(".checkboxes").each(function(index){
                                                             $(this).attr("checked", val);
                                                            // alert("设置下面全选");
                                                        });
                                                    } else {//不勾选
                                                       $(".checkboxes").each(function(index){
                                                             $(this).attr("checked", val);
                                                             //alert("取消下面全选");
                                                        });
                                                    }

                           } );     
                });

确定表是否是实例,没有实例,是否已直接更新,加载新URL:

                            if (typeof(wageNowTable) == "undefined") {
                                wageNowTable = $('#sample_1').dataTable(datatables_options);

                            }else{
                                var oSettings = wageNowTable.fnSettings();
                                oSettings.sAjaxSource = "wageQuery.action?wageDate="
                                    + date;
                                wageNowTable.fnDraw(false);//不会跳转到第一页,保留页面的页码和显示条数
                                wageNowTable.fnDraw(false);//不会跳转到第一页,保留页面的页码和显示条数
                            }