经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
datatable动态列处理,重绘表格(敲黑板,划重点!!!我肝了一天半才彻底弄懂这个东西,TAT)
来源:cnblogs  作者:梦里一米七八  时间:2019/1/14 9:36:21  对本文有异议

                                                                  datatable动态列处理,重绘表格

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

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

  1. 1 var aaa.datatable = $('#aaa').DataTable({
  2. 2 'language': lan,
  3. 3 "dom": 'lB<"top"f><"toolbar">rt<"bottom"ip><"clear">',
  4. 4 "paging": true,
  5. 5 "lengthChange": true,
  6. 6 "info": true,
  7. 7 'destroy': true,
  8. 8 "deferRender": true,
  9. 9 'columns': this.data.col_define,
  10. 10 'data': this.data.rowdata,
  11. 11 })

          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清除的.

       举个例子:

  1. var table1=$('#aaa');
  2. var int_table1=$('#aaa').Datatable();
  3. int_table1.destroy();
  4. int_table1.clear();
  5. table1.empty();

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

  1. render(table) {
  2. table.clear();
  3. table.destroy();
  4. }

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

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

  1. class Object {
  2. constructor(table) {
  3. this.data = {};
  4. this.table=table;
  5. }
  6. init(table1) {
  7. return this.table=table1.DataTable({
  8. 'language': lan,
  9. "dom": 'lB<"top"f><"toolbar">rt<"bottom"ip><"clear">',
  10. "paging": true,
  11. "lengthChange": true,
  12. "info": true,
  13. 'destroy': true,
  14. "deferRender": true,
  15. 'columns': this.data.col_define,
  16. 'data': this.data.rowdata,
  17. })
  18. }
  19. render(table){
  20. table.clear();
  21. table.destroy();
  22. }
  23. }

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

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

  1. table=$('#aaa');
  2. int_table=$('#aaa').Datatable();
  3. obj=new Object(table);
  1. $.ajax({
  2. type: 'POST',
  3. url: '/url',
  4. async: true,
  5. cache: false,
  6. data: {},
  7. dataType: 'json',
  8. beforeSend: function () {
  9. },
  10. success: function (res) {
  11. if ('ok' === res['code']) {
  12. obj.render(int_table);
  13. table.empty();
  14. console.log(table);
  15. obj.data = res['data'];
  16. obj.init(table);
  17. console.log(table);
  18. } else {
  19. alert('失败' + res['msg']);
  20. }
  21. },
  22. complete: function () {
  23. },
  24. error: function (jqXHR, textStatus, errorThrown) {
  25. var e = JSON.parse(jqXHR.responseText);
  26. console.log('失败'+e['msg']);
  27. }
  28. });

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

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

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

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

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

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

  1. render(table) {
  2. var currentPage = table.page();
  3. table.clear();
  4. table.rows.add(this.staff_list);
  5. table.page(currentPage).draw(false);
  6. }

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

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

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

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号