datatable动态列处理,重绘表格

前言:至于动态列的绘画,我前面博客已经写过了,就是动态列的配置问题,不懂的去我博客看下,今天要写的呢,就是你已经写了一个动态列在datatable,现在你想重新绘制一遍这个表格,而且也是动态列的,里面有很多细节需要注意。

首先,说一下动态列的配置,就是要在datatable配置下修改columns和data,代码如下。

 var aaa.datatable = $('#aaa').DataTable({
'language': lan,
"dom": 'lB<"top"f><"toolbar">rt<"bottom"ip><"clear">',
"paging": true,
"lengthChange": true,
"info": true,
'destroy': true,
"deferRender": true,
'columns': this.data.col_define,
'data': this.data.rowdata,
})

culumns里的this.data.col_define列定义是后台返回的data数据下有个col_define列表,列表下放着targets(列,从0开始),data(对应data下的键key),title(列名或者叫做列标题),

   data里的this.data.rowdata行数据定义是后台返回的data数据下有个rowdata列表,列表下放着每一行的键值对数据,每行用字典封装。其他的都是datatable的基本配置,想要修改成想要的其他控件可以看官网修改。

然后,就是绘制完表格怎么清表格了,搜索了官网和很多其他博客,大概思路就是用destroy,clear,empty。

这里要分别解释三个功能,第一是destroy()方法,是破坏整个表格结构,clear是清除放入的数据,需要注意的是,有人会问只用destroy不行吗,当然不行啊,因为之前列定义和行数据的放入,里面已经有数据了,你destroy只是清除了表格的结构,数据还在的,所以就会导致你的数据并没有真正清除完,还有就是empty方法,这个是用来清空datable的,这个清空,和前面两种不用,这个是清楚整个div的,所以用法也不一样,在这里我就饶了半天弯路,后面封装对象起来就容易很多了

记住,destroy和clear是datatable清除的,empty是div清除的.

举个例子:

var table1=$('#aaa');
var int_table1=$('#aaa').Datatable();
int_table1.destroy();
int_table1.clear();
table1.empty();

那么,接下来就是,把这些清除表格的方法封装到render函数即可。

 render(table) {
table.clear();
table.destroy();
}

这里需要提醒的是,把empty给拿出来,到时候具体重绘的时候再指定div去清除。还有这里的table,指的就是上面说的某div的datatable()。

结合起来,你需要封装的对象就出来了。

class Object {
constructor(table) {
this.data = {};
this.table=table;
}
init(table1) {
return this.table=table1.DataTable({
'language': lan,
"dom": 'lB<"top"f><"toolbar">rt<"bottom"ip><"clear">',
"paging": true,
"lengthChange": true,
"info": true,
'destroy': true,
"deferRender": true,
'columns': this.data.col_define,
'data': this.data.rowdata,
})
}
render(table){
table.clear();
table.destroy();
}
}

这里你会发现,我把这里的table1给标红了,为什么呢,因为我在这里摔惨了2333333.这里的table1指的就是前面提到的$('aaa'),所以不要多次一举的把table1.Datatable写成$(table1).Datatable。能做到这里,已经说明你的思路已经非常完善了,说明你已经成功了一半,下面就是AJAX的数据交互。

对了,在AJAX之前,你要先声明好你的对象。

table=$('#aaa');
int_table=$('#aaa').Datatable();
obj=new Object(table);
  $.ajax({
type: 'POST',
url: '/url',
async: true,
cache: false,
data: {},
dataType: 'json',
beforeSend: function () {
},
success: function (res) {
if ('ok' === res['code']) {
obj.render(int_table);
table.empty();
console.log(table);
obj.data = res['data'];
obj.init(table);
console.log(table);
} else {
alert('失败' + res['msg']);
}
},
complete: function () { },
error: function (jqXHR, textStatus, errorThrown) {
var e = JSON.parse(jqXHR.responseText);
console.log('失败'+e['msg']);
}
});

当然,能够完成到这里,你已经很厉害了,因为你可以自定义列,然后重绘,再自定义列,封装起来的函数以后也可以接着用。

但是,我就算完成到了这一步,我在另一个地方重绘表格的地方,居然还是报错了,找了很久,反复校对了很多遍,终于给我找到错误了,就是一开始那个datatable我没有初始化,导致我清除和赋值的时候出现了问题。

所以,大家在用datatable的时候,一定要记得初始化表格。

$('#aaa').Datatable(opts);

opts里面的配置正常写就行,反正是初始化的,到时候你重绘表格的时候就会清除掉这个初始化表格。(重绘表头和行的就讲到这里了,不懂可以在下方提问,思路应该挺清晰的了)

这里我再附带一个TIP,如果你只是重绘数据,表头不换,那么你就可以用到下面这个render函数,这也是我一开始接触的只清除数据不清除表头的方法。

render(table) {
var currentPage = table.page();
table.clear();
table.rows.add(this.staff_list);
table.page(currentPage).draw(false);
}

这个用来更新数据就很爽了,或者你用window.location.reload来更新整个页面,重新获取后台的数据初始化表格来刷新页面。其他的单纯刷新datatable方法也有就是table.draw(false)。不过这个会默认翻到第一页,所以我这里才会还有一个table.page();

工作经验:前端报错一定不要着急,看控制台报的什么错,再看前后端数据交互是否传送了正确的数据,如果没错,那就硬肝前端的错吧,datatable出现的大多数错误都是行列没对准这些错误,其实有时候并不是后端的错,可能多数都是前端绘制表格的时候出错了,关键就是找清除你自己写的代码的每一步,必要时多console.log一下,看下是否每一步都是你想要的结果,偶尔会出现undefined或者为空,那么,恭喜你,你找到错误了,离成功也就不远啦。

(前端实习的临近一个月,加油继续肝,最近的梗,是("盘"给我),我也觉得怪怪的,最近喜欢的歌,(小了白了兔,锤子之歌),都很魔性,哈哈哈哈哈哈哈哈哈哈哈哈哈嗝!)

datatable动态列处理,重绘表格(敲黑板,划重点!!!我肝了一天半才彻底弄懂这个东西,TAT)的更多相关文章

  1. dataTable 动态列 二次加载

    需要把 列头和表格内容全部清空 if ($('#datatable').hasClass('dataTable')) { var dttable = $('#datatable').dataTable ...

  2. MFC窗口重绘

    Invalidate()与 UpdateAllViews()有什么分别 Invalidate()是让程序重画窗口. UpdateAllViews()是在DOC/VIEW结构中, 当一个视图的数据改变后 ...

  3. MFC重绘原理的关键理解

    // ====================Windows重绘消息与函数========================== 得到桌面窗口的句柄,然后再绘图HWND GetDesktopWindow ...

  4. IE8中伪元素动态作用样式不重绘bug记录

    前阵子对公司框架的前端优化中,使用了字体图标(iconfont)来做模块的图标集,供用户进行配置选择. 字体图标的有非常好的灵活性和复用性,可以像处理文字一样通过font-size进行大小设置.通过c ...

  5. 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)

    /// <summary> /// List转换为DataTable对象 /// </summary> public class ListTranTableModel { // ...

  6. vue原生表格怎样实现动态列及表格数据下载

    最近项目经常用到带有合并效果以及动态列的表格,而翻阅iview和element-ui官网没有找到合适的(也有可能自己的水平有限,不会改写),所以只好自己用原生表格写了一个,具体效果如下: 这个表格右侧 ...

  7. 回流(reflow)与重绘(repaint)

    最近项目排期不紧,于是看了一下之前看了好久也没看明白的chrome调试工具的timeline.但是很遗憾,虽然大概懂了每一项是做什么的,但是用起来并不能得心应手.所以今天的重点不是timeline,而 ...

  8. TListView Header重绘和高度设置

    TListView 的 Header 部分默认 BtnFace 颜色,高度也不能改变.我们可以通过编写一些代码来实现这些功能: 获得TListView 的Header 的句柄: TListView的H ...

  9. 理解浏览器的重绘与回流(repaint&&reflow)

    今天在做练习的时候,遇到了重绘与回流这个词,表示连个毛都没有听过.遂查之,首先将网上的(http://blog.sina.com.cn/s/blog_8dace7290102wezv.html)关于这 ...

随机推荐

  1. .Net Core使用Redis(CSRedis)

    前言 CSRedis是国外大牛写的.git地址:https://github.com/2881099/csredis,让我们看看如果最简单的 使用一下CSRedis吧. 引入NuGet 获取Nuget ...

  2. hbase coprocessor 二级索引

    Coprocessor方式二级索引 1. Coprocessor提供了一种机制可以让开发者直接在RegionServer上运行自定义代码来管理数据.通常我们使用get或者scan来从Hbase中获取数 ...

  3. Windows 10-限制Windows更新上传带宽

    Windows Update Delivery Optimization可帮助您更快,更可靠地获取Windows更新和Microsoft Store应用程序. Windows Update Deliv ...

  4. Win10系统盘制作及安装流程

    一.下载最新版的 Win10 镜像 1.打开 MSDN 下载 Windows 系统镜像,即 https://msdn.itellyou.cn/ ​ 2.下载的 iso 镜像文件 ​ 3.你可以通过双击 ...

  5. Java提取URL某个参数的值

    Java提取Url中某个参数的值. public static String getParam(String url, String name) { String params = url.subst ...

  6. ASP.NET Aries 高级开发教程:Excel导入之单表配置(上)

    前言: 随着ASP.NET Aries的普及,刚好也有点闲空,赶紧把Excel导入功能的教程补上. Excel导入功能,分为四篇:单表配置(上).多表高级配置(中).配置规则(下).代码编写(番外篇) ...

  7. Ubuntu16 Nginx的安装与基本配置

    关于Nginx 它是一个轻量级.高性能.稳定性高.并发性好的HTTP和反向代理服务器,当我们搭建自己的应用时,通常用它作为反向代理服务器,图片服务器和负载均衡. 1.Ubuntu 16安装 Nginx ...

  8. Ubuntu 18.04.1 LTS + kolla-ansible 部署 openstack Rocky all-in-one 环境

    1. kolla 项目介绍 简介 kolla 的使命是为 openstack 云平台提供生产级别的.开箱即用的自动化部署能力. kolla 要实现 openetack 部署分为两步,第一步是制作 do ...

  9. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  10. 从零开始学习PYTHON3讲义(十三)记事本的升级版:网络记事本

    <从零开始PYTHON3>第十三讲 网络编程的火热和重要性这里就不多说了,我们直接来看看Python在互联网编程方面的表现. Python有很多网络编程的第三方扩展包,这里推荐一个我认为最 ...