在DataTables中刷新分页?

时间:2012-10-29 13:33:53

标签: javascript jquery datatables

我遇到一个奇怪的问题,这个问题只出现在我选择的环境中的dataTable中。我编写了一个允许用户删除行的函数,如果它是该特定页面的最后一行,则重新加载表并将用户发送到“新”的最后一页。

但是,在某些服务器上,它运行不正常 - 我认为这与使用fnClearTable和fnDraw之后的事实有关,表的分页仍然保留最后一个“空”页。

这是我现在正在使用的功能:

function fnDelete(elem) {

if (selected.length > 0) {
var c;
c = confirm("Are you sure you want to delete the selected Agency?");
if (c) {
    var deleteURL = urlstr.substring(0, urlstr.lastIndexOf("/") + 1) + "delete.do";
    deleteRecord(deleteURL, selected[0]);

    if ($(".tableViewer tbody tr:visible").length === 1) {
    oTable.fnClearTable();
    oTable.fnDraw();
    oTable.fnPageChange("last");

}}}}

另外,这是我的delet功能。

function deleteRecord(deleteURL, iid){
    var didDelete = false;
    jQuery.ajax({
            type: "POST",
            url: deleteURL,
            dataType:"html",
            data:"recordID="+iid,
            async : false,
            success:function(response){
                didDelete = true;
                oTable.fnDraw(true);
                selected = [];
                selectedRecord = [];
                enableButtons(selected);
            },
            error:function (xhr, ajaxOptions, thrownError){
                <%-- is the message in a range we can handle? --%>
                if ((xhr.status >=400) && (xhr.status < 500)) {
                    alert(xhr.responseText);
                }
                else {
                    alert('<spring:message arguments="" text="Internal Server Error" code="ajax.internal.server.error"/>');
                }
            }   
        });

    return didDelete;
}

同样,这个问题只出现在某些计算机上。有人可以帮忙吗?

此外,这是我的DataTable ::

的配置
oTable = $('#${tableName}_grid').dataTable({
        bDestroy: true,
        bSort: true,
        bFilter: true,
        bJQueryUI: true,
        bProcessing: true,
        bAutoWidth: true,
        bInfo: true,
        bLengthChange: true,
        iDisplayLength: ${sessionScope.displayLength},
        sPaginationType: 'full_numbers',
        bServerSide: true,
        sAjaxSource: "<c:url value='${dataUrl}'/>",
        aaSorting: [<c:forEach items="${sortInfo}" var="oneSort">    [${oneSort.columnIndex},'${oneSort.ascending ? "asc":"desc"}']</c:forEach>],
        aoColumns: [
            <c:forEach items="${columns}" var="curCol" varStatus="colLoop">
                {sName: '${curCol.fieldName}', bSortable: ${curCol.sortable}, bSearchable: false, sTitle: "<c:out value='${curCol.title}'/>", sType: '${curCol.displayType}', bVisible:${curCol.visible}, vdbType:'${curCol.vdbType}', sClass:'${curCol.displayType}'}${colLoop.last ? '' : ','}
            </c:forEach>
            ],
            aoColumnDefs:[{sClass:"color_col", aTargets:['color']}],

            fnRowCallback: function( nRow, aData, iDisplayIndex ) {
                $('#${tableName}_grid tbody tr').each( function () {
                    if ($.inArray(aData[0], selected)!=-1) {
                        $(this).addClass('row_selected');
                    }
                });
                return nRow;
            },
            fnInfoCallback: function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {

if(myPos>=iStart && myPos<=iEnd){
    //alert(myPos+" visible")
}else{
    selected = [];
    selected = [];
    selectedRecord = [];
    $('tr').removeClass('row_selected');
    enableButtons(selected);
}

},
            fnDrawCallback: function ( oSettings ) {



                $('#${tableName}_grid tbody tr').each( function () {
                    var iPos = myPos = oTable.fnGetPosition( this );
                    if (iPos!=null) {
                        var aData = oTable.fnGetData( iPos );
                        if ($.inArray(aData[0], selected)!=-1) {
                            $(this).addClass('row_selected');
                        }
                    }
                    var htxt = '';
                    $(this).find('.color').filter(function(i,tdata){
                        htxt = '';
                        htxt = '#'+($(tdata).text());
                        return true;
                     }).css("background",htxt);
                    $(this).dblclick( function(){
                        var iPos = myPos = oTable.fnGetPosition(this);
                        var aData = oTable.fnGetData(iPos);
                        var iId = aData[0];
                        selected = [];
                        selectedRecord = [];
                        selected.push(iId);
                        selectedRecord.push(aData);
                        $('tr').removeClass('row_selected');
                        $(this).addClass('row_selected');
                        enableButtons(selected);
                        <%-- in case there is no edit button or its enablement is more complex,
                        // click the button instead of assuming it will call fnEdit.
                        // Do first() because jQuery is returning the same element multiple times.--%>
                        $(".${tableName}_bttns > span.edit-doubleclick:not(.disabld)").first().click();
                    });
                    $(this).click( function () {
                    var iPos = myPos =  oTable.fnGetPosition(this);<%-- row index on_this_page --%>
                        var aData = oTable.fnGetData(iPos);
                        var iId = aData[0];
                        var is_in_array = $.inArray(iId, selected);
<%-- alert("iPos: " + iPos + "\nData: " + aData + "\niId: " + iId + "\nselected: " + selected + "\nis_in_array: " + is_in_array); --%>
                        selected = [];
                        selectedRecord = [];
                        if (is_in_array==-1) {                              
                            selected.push(iId);
                            selected.sort(function(a,b){return a-b});
                            selectedRecord.push(aData);
                            selectedRecord.sort(function(a,b){return a[0]-b[0]});
                        }
                        else {
                            selected = $.grep(selected, function(value) {
                                return value != iId;
                            });
                            selectedRecord = $.grep(selectedRecord, function(value) {
                                return value != aData;
                            });
                        }
                        if ( $(this).hasClass('row_selected') ) {
                            $(this).removeClass('row_selected');
                        }
                        else {
                            $('#${tableName}_grid tr').removeClass('row_selected');
                            $(this).addClass('row_selected');
                        }
                        enableButtons(selectedRecord);
                    });
                });
            } ,
            "sDom": '<"H"lTfr>t<"F"ip>',
            "oTableTools":{
                "aButtons":[ { 
                    "sExtends":"print", 
                    "bShowAll": true,
                    "sInfo": printmsg,
                    "sButtonClass":"ui-icon fg-button ui-button edit-print DTTT_button_print",
                    "sButtonClassHover":"ui-icon fg-button ui-button edit-print DTTT_button_print"
                } ] }
        });
        $('#${tableName}_grid_filter input').attr("maxlength", "255").attr("size", "35");

        $('#${tableName}_grid').ready(function(){

            $(".DTTT_containerc").remove();

            BuildToolBarButtons();

           var tt;
           $(".DTTT_containerc").each(function(){
                tt = $(this).find("#Print").attr("title");
                $(this).find("#Print").remove();  
                $(this).find(".DTTT_container").remove();  
                }
            );

            $(".DTTT_container > button").attr("title",tt).css("border","1px solid #9597A3").removeClass("ui-state-default");    
            $(".DTTT_containerc").append($(".DTTT_container").removeAttr("style"));
        });
    });

3 个答案:

答案 0 :(得分:2)

您的数据表配置为使用ajax加载数据。这意味着针对数据的任何操作都是异步发生的。具体来说,fnDraw()函数允许控件转到您从服务器返回新数据之前更改页面页面的语句。您应该将带您到最后一页的逻辑移动到fnDrawCallback。我认为应该解决你的问题。

答案 1 :(得分:0)

我以为我会写一个回复来帮助别人说明我是如何修理它的。

@Gavin是正确的,因为它在错误的地方 - 我将有问题的函数移动到AJAX中的成功回调。但是,要完全修复它,我必须'premptively'读取删除发生在哪个页面(使用fn.PageChange插件),减去1(bc DataTables从零开始)并将用户发送到那里。

希望这有助于任何人! @Gavin,谢谢你的帮助,并带领我走向正确的方向!

答案 2 :(得分:0)

表刷新后,您可以保持同一页面。刷新数据表后,您需要使用以下代码段来保持您的分页相同。只需将js代码后面的粘贴复制到一个单独的文件中,然后将其与当前页面挂钩。

$.fn.dataTableExt.oApi.fnStandingRedraw = function(oSettings) {

   if(oSettings.oFeatures.bServerSide === false){
      var before = oSettings._iDisplayStart;
      oSettings.oApi._fnReDraw(oSettings);       
      oSettings._iDisplayStart = before;
      oSettings.oApi._fnCalculateEnd(oSettings);
   } 
    oSettings.oApi._fnDraw(oSettings);
};

现在,您可能会使用&#34; fnDraw&#34;刷新dataTable。所以现在,而不是代码。像这样改变它。

oTable1.fnStandingRedraw();

现在,您的dataTable将在刷新后保持相同的页面。