首页 热点资讯 义务教育 高等教育 出国留学 考研考公

web开发中datatable怎么重新异步加载时报错

发布网友 发布时间:2022-04-25 12:39

我来回答

2个回答

懂视网 时间:2022-05-15 09:26

这次给大家带来datatable怎样实现异步加载,datatable实现异步加载的注意事项有哪些,下面就是实战案例,一起来看一下。

table部分代码

<table class="table table-bordered table-striped" id="table-main">
 <thead>
 <tr>
 <th>用户名</th>
 <th>渠道名</th>
 <th>游戏名</th>
 <th>结果</th>
 <th>耗时</th>
 <th>创建时间</th>
 </tr>
 </thead>
</table>

异步加载数据并实现定制化

下面是简单例子, 其中 table-main 的初始化元素为table的id。

$('#select-game').select2(); // 初始化搜索下拉框
 
 // 表格汉化列表
 var table_lang = {
 "sProcessing": "处理中...",
 "sLengthMenu": "每页 _MENU_ 项",
 "sZeroRecords": "没有匹配结果",
 "sInfo": "当前显示第 _START_ 至 _END_ 项,共 _TOTAL_ 项。",
 "sInfoEmpty": "当前显示第 0 至 0 项,共 0 项",
 "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
 "sInfoPostFix": "",
 "sSearch": "搜索:",
 "sUrl": "",
 "sEmptyTable": "表中数据为空",
 "sLoadingRecords": "载入中...",
 "sInfoThousands": ",",
 "oPaginate": {
 "sFirst": "首页",
 "sPrevious": "上页",
 "sNext": "下页",
 "sLast": "末页",
 "sJump": "跳转"
 },
 "oAria": {
 "sSortAscending": ": 以升序排列此列",
 "sSortDescending": ": 以降序排列此列"
 }
 };
 
 //初始化表格
 var table_main = $("#table-main").dataTable({
 language:table_lang, // 提示信息
 autoWidth: false, // 禁用自动调整列宽
 lengthMenu: [25, 50, 100],
 stripeClasses: ["odd", "even"], // 为奇偶行加上样式,兼容不支持CSS伪类的场合
 processing: false, // 隐藏加载提示,自行处理
 serverSide: true, // 启用服务器端分页
 searching: true, // 启用原生搜索
 orderMulti: true, // 启用多列排序
 order: [], // 取消默认排序查询,否则复选框一列会出现小箭头
 renderer: "bootstrap", // 渲染样式:Bootstrap和jquery-ui
 pagingType: "simple_numbers", //分页样式:simple,simple_numbers,full,full_numbers
 columnDefs: [{
 "targets": 'nosort', // 列的样式名
 "orderable": false // 包含上样式名‘nosort'的禁止排序
 }],
 ajax: function (data, callback, settings) {
 //封装请求参数
 var param = {};
 param.limit = data.length; // 页面显示记录条数,在页面显示每页显示多少项的时候
 param.start = data.start; // 开始的记录序号
 param.page = (data.start / data.length)+1; // 当前页码
 //ajax请求数据
 $.ajax({
 type: "GET",
 url: "getRecodeList",
 cache: true, // 开启缓存
 data: param, // 传入组装的参数
 dataType: "json",
 success: function (result) {
//  console.log(result);
  //setTimeout仅为测试延迟效果
  setTimeout(function () {
  //封装返回数据
  var returnData = {};
  returnData.draw = data.draw; // 这里直接自行返回了draw计数器,应该由后台返回
  returnData.recordsTotal = result.total; // 返回数据全部记录
  returnData.recordsFiltered = result.total;// 后台不实现过滤功能,每次查询均视作全部结果
  returnData.data = result.data; // 返回的数据列表
  //console.log(returnData);
  // 调用DataTables提供的callback方法,代表数据已封装完成并传回DataTables进行渲染
  // 此时的数据需确保正确无误,异常判断应在执行此回调前自行处理完毕
  callback(returnData);
  cut_td($("#table-main"), 40); // 表格截断
 
  }, 200);
 }
 });
 },
 //列表表头字段
 columns: [
 { "data": "user_name" },
 { "data": "channel" },
 { "data": "game" },
 { "data": "status",
 "render": function(data){
  var status_name = '';
  switch(data)
  {
  case 0: status_name = '未完成'; break;
  case 1: status_name = '脚本错误'; break;
  case 2: status_name = '成功'; break;
  case 3: status_name = '测试通过'; break;
  default : status_name = '未知'; break;
  }
  return status_name;
 }},
 { "data": "cast_time",
 "render" : function(data){
  if (data)
  {
  return data + 's';
  }
  else
  {
  return '废弃';
  }
 }},
 { "data": "format_created_at" },
 ]
 }).api();

后台数据返回格式

{
 "total": 234,
 "per_page": "25",
 "current_page": 1,
 "last_page": 10,
 "next_page_url": "http://local.dgc_sdkops.com/monitor/log_pack/getRecodeList?page=2",
 "prev_page_url": null,
 "from": 1,
 "to": 25,
 "data": [
 {
 "id": 128,
 "user_id": 1,
 "task_id": "package_128_113",
 "channel_version_id": 128,
 "game_version_id": 113,
 "extend_id": 0,
 "type": "pack",
 "status": 2,
 "remark": "",
 "cast_time": 93475,
 "created_at": "1500365068",
 "updated_at": "1500458543",
 "user_name": "admin",
 "format_created_at": "2017-07-18 16:04:28",
 "format_updated_at": "2017-07-18 16:04:28",
 "game": "x",
 "channel": "y",
 "game_id": 11290,
 "channel_id": 67
 },
 {
 "id": 240,
 "user_id": 1,
 "task_id": "package_128_113",
 "channel_version_id": 128,
 "game_version_id": 113,
 "extend_id": 0,
 "type": "pack",
 "status": 0,
 "remark": "",
 "cast_time": 0,
 "created_at": "1500458454",
 "updated_at": "1500458454",
 "user_name": "admin",
 "format_created_at": "2017-07-19 18:00:54",
 "format_updated_at": "2017-07-19 18:00:54",
 "game": "x",
 "channel": "y",
 "game_id": 11290,
 "channel_id": 67
 }
 ]
}

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

Vue2.0怎样操作用户权限

axios使用步骤详解(附代码)

热心网友 时间:2022-05-15 06:34

如果表格的数据不是固定的,譬如需要根据时间等参数变化,那么不可避免的需要异步加载数据。
需要注意的是,dataTable表格对象不允许两次初始化,所以你不能简单粗暴的再次执行表格的构建方法,官方文档提供了相关的表格数据重新加载的方法,这里记载一下。

之前说过,dataTable数据来源可以直接对data属性赋值,或者使用ajax属性发起请求。我原本以为官方会提重置data的方法,不过在官网文档上面没有找到,到是后者,官方提供了重新加载数据的方法:table.ajax.reload().draw(),这就意味着,如果想使用重新加载数据的功能,你的数据来源只能是ajax。

我尽量把项目里地代码拆开,使demo更加简单明了。
这里需要注意两点:一是如何获取表格对象,二是如何重写ajax函数。

获取已经初始化的表格对象并重新加载数据

Javascript代码
var table = $('#example').DataTable();
table.ajax.reload().draw();

在写ajax函数时,需要调用cakkback方法,参数就是你需要填充进表格的数据。需要注意的是这是一个对象

Javascript代码
"ajax" : function(data, callback, settings) {
// 获取发起ajax的参数
var param = {};
param.service_code = $("#serviceSelection").val();
param.start = $("#startTime").val();
param.end = $("#endTime").val();
if ($("#callerSelection").val() != 'all')
param.caller = $("#callerSelection").val();
// 发起ajax请求,获取数据
var ajaxData = getAjax(param, "/api/hm/service/record",
false);
var data = ajaxData.data;
// 解析数据
if (ajaxData.status == 100) {
var tableData = new Array(data.records.length);
for (i = 0; i < data.records.length; i++) {
arrary = new Array(9);
arrary[0] = data.records[i].id;
arrary[1] = "<span>"+data.records[i].request+</span>";
arrary[2] = data.records[i].caller;
arrary[3] = data.records[i].status_text;
arrary[4] = data.records[i].reason;
arrary[5] = data.records[i].use_cache;
arrary[6] = data.records[i].create_time;
arrary[7] = data.records[i].invoke_time;
arrary[8] = "<button onclick='showModal("
+ data.records[i].id + ")'>查看日志</button>";
tableData[i] = arrary;
}
// 填充数据,填充表格的数据是一个对象,对象需要一个叫data的属性,这个属性对应的值,才是表格真正的数据

var requireData = {};
requireData.data = tableData;
callback(requireData);
} else {
var requireData = {};
requireData.data = [];
callback(requireData);
}
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com