【问题标题】:Server side pagination is not rendering the table data服务器端分页不呈现表格数据
【发布时间】:2015-07-10 04:22:30
【问题描述】:

我正在尝试从服务器端进行分页。我的项目技术栈是 MongoDB + Spring + Angular + Angular-datatables。

MongoDB 提供了非常简单的方法来根据分页和排序参数检索数据

此处粘贴了获取数据的 URL,这是一个 'POST' 请求,并且还希望通过请求正文发送一些其他参数

 /myapp/products/filter?pageSize=10&pageNo=1

经过一番谷歌搜索并浏览了 jQuery DataTables 手册后,我在angular-datatables 中发现了如何进行此操作。粘贴以下代码:

     vm.dtOptions = DTOptionsBuilder.newOptions().withOption('ajax', {
            url : '/myapp-api/products/filter',
            type : 'POST',
            contentType : 'application/json',
            dataType :'json',
            accepts: "application/json",
            headers: {
                Accept: "application/json",
                Authorization : 'Bearer eyJ0eXAiO.eyJpZCI6IjU1OhSbNTdmIoq1Y'
            },
            data:function(d){
                     var pageNo = d.start;
                 var pageSize = d.length;
                     return JSON.stringify( d );
            },
            success:function(response){
                console.log(" ajax > post > success > response > ", response);
                var page = {
                    "draw":1,
                    "data" : response.list,
                    "recordsTotal" :response.list.length,
                    "recordsFiltered" :response.list.length
                };
                return page;
            }
        })
        .withDataProp('data')
        .withOption('processing', true)
        .withOption('serverSide', true)
        .withPaginationType('full_numbers');

我能够成功接收响应,但数据表未显示数据。在成功函数回调中,按照数据表网页中提到的格式返回数据。

此外,我还有一些疑问:

  1. 我可以使用$http.post 方法从服务器检索数据吗,我知道数据表有一些机制,它在数据表中完成的每个操作上调用 ajax。

  2. data: function(){} 以对象格式为我提供了整个数据表列和其他详细信息,使用 JSON.Stringify(data) 作为解决方法。

我的服务器端实现需要 JSON 数据,我只需要几个参数。

这里有没有人使用$http.post 方法完成了实现。当我尝试它时,它给了我错误:

TypeError: 无法读取未定义的属性“aDataSort”

    $scope.dtOptions = DTOptionsBuilder.newOptions()
     .withOption('ajax', function(data, fnCallback, settings) {
            $http.post('/myapp/products/filter?pageNo=1&pageSize=10', {}).then(function(response) {
                  fnCallback(response);
     });      
    })
    .withDataProp('list')
    .withOption('processing', true)
    .withOption('serverSide', true)
    .withPaginationType('full_numbers');

【问题讨论】:

    标签: angularjs spring mongodb datatables


    【解决方案1】:

    请参阅下面的更正代码。

    您没有正确地将 pageNopageSize 设置为 URL 参数。

    另外根据手册,success 方法绝不能被覆盖,因为它正在被 DataTables 内部使用。相反,您可以使用withDataProp 定义一个回调,该回调将在从服务器接收到响应时调用。

    请注意,通过服务器端处理,响应中的draw 参数值必须与请求中的draw 参数值匹配。我使用vm 对象在请求和响应之间存储它的值。

    另外值得一提的是,您需要使用 DataTables 版本 1.10.6 或更高版本才能使此代码正常工作。

    vm.dtOptions = DTOptionsBuilder.newOptions().withOption('ajax', {
           url : '/myapp-api/products/filter',
           type : 'POST',
           contentType : 'application/json',
           dataType : 'json',
           accepts: "application/json",
           headers: {
               Accept: "application/json",
               Authorization : 'Bearer eyJ0eXAiO.eyJpZCI6IjU1OhSbNTdmIoq1Y'
           },
           data: function(d, settings){
               var api = new $.fn.dataTable.Api(settings);
    
               // Update URL
               api.ajax.url(
                  '/myapp-api/products/filter?pageNo=' + d.start + '&pageSize=' + d.length
               );
    
               // Store "draw" parameter
               vm.dtDraw = d.draw;
    
               return JSON.stringify(d);
           }
       })
       .withDataProp(function(json){
           console.log(" ajax > post > success > response > ", json);
    
           // Retrieve "draw" parameter
           json.draw = vm.dtDraw;
    
           json.recordsTotal = json.list.length;
           json.recordsFiltered = json.list.length;
    
           return json.list;
       })
       .withOption('processing', true)
       .withOption('serverSide', true)
       .withPaginationType('full_numbers');
    

    【讨论】:

    • 谢谢。数据正在显示。我有一个观察,下面的代码没有更改 URL 并将设置设置为 undefined value 。我们可以通过任何其他方式访问数据参数吗? var api = new $.fn.dataTable.Api(settings); api.ajax.url('/myapp-api/products/filter?pageNo='​​ + d.draw + '&pageSize=' + d.length);
    • @Hurix,还有其他方法,但如果serverSide: true,则d.startd.length 不应未定义。你能在data: function(){} 中做console.log(d) 并告诉我你看到了什么属性吗?
    • 仍然,我将设置值设置为未定义。请注意,我使用 angular-datatables 作为数据表的包装器。我的数据对象在这里{ "draw": 1, "columns": [{}], "order": [ { "column": 0, "dir": "asc" } ], "start": 0, "length": 10, "search": { "value": "", "regex": false } }
    • @Hurix,需要注意的一点是,在 DataTables 1.10.6 中添加了 data 中的 settings 变量。这就是设置 URL 不起作用的原因。您可能使用的是旧版本,您可以从他们的网站下载最新的 DataTables 1.10.7 并重新测试吗?
    • @victor,那么您可能确实在使用服务器端模式。你能开始一个新的问题吗?您不需要手动传递d.order[0].column,DataTables 应该为您完成。这个特殊问题需要带有JSON.stringify(d) 的 JSON 编码数据,我不确定您的服务是否需要 JSON 编码的参数。
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2021-04-20
    • 2019-10-17
    相关资源
    最近更新 更多