更改为服务器端处理后,jQuery数据表分页中断

时间:2012-03-07 21:09:56

标签: javascript jquery datatables

我有一个页面正在初始化一个空的dataTable,并在从select.It更改jquery之后使用$ .getJSON()获取json数据。然后使用.fnAddData添加到表中。这样:

oTableDisk = $('#disk_connection_table').dataTable({
        "bJQueryUI": true,
        "iDisplayLength": 30,
        "oLanguage": {
            "sLengthMenu": tableLength
        },
        "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull){
            $(nRow).attr('id', aData[0] + "|<?php echo $this->hostInfo['name']; ?>|<?php echo $this->hostInfo['id']; ?>");
            return nRow;
        },
        "aoColumns": [{"bSearchable": false, "bVisible": false}, null, null, null, null, null, null]
    });

$('#disk_switch').change(function(){
        $.getJSON('/host/getavailableports?type=disk&switch=' + $('#disk_switch option:selected').val(), function(data){
            if(data[0]){
                data.reverse();
                oTableDisk.fnClearTable();
                $.each(data, function(index){
                //console.log(data[index]);
                    oTableDisk.fnAddData([data[index]['Item1'],
                                        data[index]['Item2'], 
                                        data[index]['Item3'], 
                                        data[index]['Item4'], 
                                        data[index]['Item5'], 
                                        data[index]['Item6'], 
                                        data[index]['Item8']]);

                });
                enableEditable(oTableDisk);
            }
        });
    });

这个工作正常,直到我们需要处理超过500行的信息并且因为“脚本已经变得无法响应”错误而破坏了IE。

现在,我根本没有初始化一个空的dataTable,而是在选择菜单改变时创建一个:

 $('#disk_switch').change(function(){
        oTableDisk = $('#disk_connection_table').dataTable({
            "bJQueryUI": true,
            "iDisplayLength": 30,
            "bProcessing": true,
            "bServerSide": true,
            "bDestroy": true,
            "sAjaxSource": '/host/getavailableports?type=disk&switch=' + $('#disk_switch option:selected').val(),
            "aaSorting": [[0, "asc"]],
            "oLanguage": {
                "sLengthMenu": tableLength
            },
            "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull){
                $(nRow).attr('id', aData[0] + "|<?php echo $this->hostInfo['name']; ?>|<?php echo $this->hostInfo['id']; ?>");
                return nRow;
            },
            "aoColumns": [{"bSearchable": false, "bVisible": false}, null, null, null, null, null, null],

            "fnDrawCallback": function() {
                $( oTableDisk.fnGetNodes() ).click( function () {
                    enableEditable(oTableDisk);
                } );
            }

        });

重写控制器和模型以支持带有限制的查询,其中和orderby参数我正在获取数据,看起来我的JSON对象格式正确。问题是现在我没有分页功能。或排序功能。该表将分页箭头显示为灰色,单击列标题并没有真正起作用。在分页链接上方,它显示“显示30个条目中的1到30个(从483个条目中过滤掉)”,这对于查询是正确的。

我认为这与在加载页面后加载表有关,但我不知道如何修复它。

1 个答案:

答案 0 :(得分:2)

您的服务器只是没有发回所需服务器端参数的正确值:

http://datatables.net/usage/server-side

我愿意花十一块钱在这里:

iTotalRecords是绝对记录总数。你可能在这里设置了一个正确的值。

iTotalDisplayRecords - 是服务器端过滤之后的记录总数。这不仅仅是发回的记录数量。这个价值十一美元的赌注就是你用你的新控制器将“30”放在这里。

如果您仍然不确定第二个目的,请记住可以通过搜索或其他过滤器减少查询。因此,假设我有500条记录,其中250条记录中包含“Foobar”字符串。如果我搜索“Foobar”并且服务器正确处理此过滤器,它应该将我的可用记录缩小到250.然后服务器端实际上只会根据iDisplayStart和{{1}发送回请求的记录(应该由DT自动提供)。在您的情况下,服务器将发回30条记录,听起来它已经正确发送。