zoukankan      html  css  js  c++  java
  • Datatables后台服务器端分页、根据条件重新查询、主要技术问题

    首先是表格配置,非常重要的是,其中有一个配置项“fnServerData:”你是哪里也查不到的,只在吾辈前端中口口相传(也可能是插件之类?),配置它的回调函数便可以实现分页:

     1       $('#alarmList').DataTable( {
     2            "sDom": "<'exportOptions'T><'table-responsive't><'row'<p i>>",
     3            "bDestory": true,
     4            "scrollCollapse": true,
     5            "oLanguage": {//国际化配置
     6                "sLengthMenu": "显示 _MENU_ 条",
     7                "sInfo": "当前数据为从第从 <b>_START_ 到 _END_</b>条记录 总记录数为_TOTAL_条",
     8                "sSearch" : "搜索",
     9                "sZeroRecords" : "没有符合条件的数据",
    10                "sProcessing" : "正在获取数据,请稍后...",
    11                "sInfoEmpty" : "显示第 0 至 0 项结果,共 0 项",
    12                "sInfoFiltered" : "(全部记录数 _TOTAL_ 条)",
    13                "sUrl" : "",
    14                "oPaginate": {
    15                     "sFirst" : "第一页",
    16                     "sPrevious" : "上一页",
    17                     "sNext" : "下一页",
    18                    "sLast" : "最后一页"
    19                }
    20 
    21            },
    22            "iDisplayLength": 10,
    23            "bSort": true, //是否启动各个字段的排序功能
    24            "bAutoWidth": false, //是否自适应宽度
    25            "bServerSide": true, //是否启动服务器端数据导入
    26            "sAjaxSource": '',
    27            "fnServerData": retrieveData,//分页回调函数
    28            "sPaginationType": 'full_numbers',
    29            "oTableTools": {
    30                sSwfPath: "assets/plugins/jquery-datatable/extensions/TableTools/swf/copy_csv_xls_pdf.swf",
    31                aButtons: [{
    32                    sExtends: "csv",
    33                    sButtonText: "<i class='pg-grid'></i>",
    34                }, {
    35                    sExtends: "xls",
    36                    sButtonText: "<i class='fa fa-file-excel-o'></i>",
    37                }, {
    38                    sExtends: "pdf",
    39                    sButtonText: "<i class='fa fa-file-pdf-o'></i>",
    40                }]
    41            },
    42            "fnInfoCallback": function (oSettings, iStart, iEnd, iMax, iTotal, sPre) {
    43                 return sPre;
    44             },
    45            "fnDrawCallback": function(oSettings) {
    46                $('.export-options-container').append($('.exportOptions'));
    47 
    48                $('#ToolTables_tableWithExportOptions_0').tooltip({
    49                    title: 'Export as CSV',
    50                    container: 'body'
    51                });
    52 
    53                $('#ToolTables_tableWithExportOptions_1').tooltip({
    54                    title: 'Export as Excel',
    55                    container: 'body'
    56                });
    57 
    58                $('#ToolTables_tableWithExportOptions_2').tooltip({
    59                    title: 'Export as PDF',
    60                    container: 'body'
    61                });
    62            },
    63            "columns": [
    64                {
    65                   data: "id",
    66                   render: function (data, type, row, meta) {
    67                       if(data){
    68                            return '<input type="checkbox" name="checklist" data-id="' + data + '" value="' + data + '" />';
    69                       }
    70                   }
    71                },//多选框 绑定设备id
    72                {
    73                   data: "level",
    74                   render: function (data, type, row, meta) {
    75                       return "<img src='" + data + "' />";
    76                   }
    77                },//级别
    78                {
    79                   data: "state",
    80                   render: function (data, type, row, meta) {
    81                       return "<img src='" + data + "' />";
    82                   }
    83                 },//状态
    84                { data: "eventType" },//事件类型
    85                { data: "happenTime" },//发生时间
    86                { data: "describe"}//描述
    87            ]
    88        } );

    然后是回调函数,最坑的来了,返回的数据对象中必须包含data,recordsTotal,recordsFiltered这3项,每个项目的后台返回的json格式不同,那可能你就需要再组装一遍啦

     1     function retrieveData(sSource, aoData, fnCallback) {
     2       // console.log(aoData);
     3           /**
     4            * [http配置项]
     5            * @type {Object}
     6            */
     7           var config =  {
     8             "method":"post",
     9             //"url":"/nms/assets/js/api/event/historicalEvents.json",
    10             "url":requrl("/nms/assets/js/api/event/historicalEvents.do"),
    11             "params":{
    12               'deviceType':$scope.equType,
    13               'type':$scope.eventType,
    14               'device':$scope.equ,
    15               'state':$scope.eventState.selected.code,
    16               'level':$scope.eventLevel.selected.code,
    17               'startTime':$('#reportrange span').html().split(' ~ ')[0],
    18               'endTime':$('#reportrange span').html().split(' ~ ')[1],
    19               'limit':10,//每页显示最多10条数据
    20               'start':aoData[3].value,//数据起始序号
    21               'page':(aoData[3].value/10)+1 //页数
    22             }
    23           };
    24           console.log(config);//此处查看参数的更改
    25           promiseHttpService.mock(config).then(function (data) {//封装的http服务
    26                 console.log(data);
    27                 var ndata = {};//返回的数据需要固定格式,否则datatables无法解析,所以需要重新组装
    28                 ndata.data = data.data.dataList;
    29                 // data.draw = draw;
    30                 ndata.recordsTotal = data.data.total;//返回数据全部记录,对象属性为固定格式不可更改,影响表格信息显示
    31                 ndata.recordsFiltered = ndata.recordsTotal;//后台不实现过滤功能,每次查询均视作全部结果,对象属性为固定格式不可更改,影响表格信息显示
    32                 console.log(ndata);
    33                 fnCallback(ndata); //服务器端返回的对象的returnObject部分是要求的格式
    34             });
    35       }

    以上是显示部分,那么如果想点击按钮,重新组织参数进行查询该怎么做呢?我刚开始以为也需要重新给表格赋值,实际上有更好的方法:

    1       $scope.queryBtn = function(){
    2         $('#alarmList').dataTable().fnDraw();
    3       }

    没错这一行就可以了,.dataTable().fnDraw()刷新Datatable,会自动激发retrieveData函数

  • 相关阅读:
    python安装教程
    protobuf安装教程
    PlantUML安装教程
    题解-CF1140E Palindrome-less Arrays
    FST
    线段树
    题解-CF677D Vanya and Treasure
    最短路
    后缀自动机
    虚树
  • 原文地址:https://www.cnblogs.com/oldcook/p/7117002.html
Copyright © 2011-2022 走看看