【问题标题】:DataTable assigned to constructor not adding data分配给构造函数的 DataTable 不添加数据
【发布时间】:2019-09-12 14:06:57
【问题描述】:

我已经定义了一个类如下:

(function() {
     'use strict';

      function UsersHelper(){
           this.init();
           this.usersTable = null;
      }

      UsersHelper.prototype.init = function(){

         $('#userType').on('change', function(){
              let newData = [{ 'name': 'foo' }];
              this.usersTable.row.add(newData);
         }.bind(this));

         this.initUserTable();
      };

      UsersHelper.prototype.initUserTable = function(){
          this.usersTable = $('#my-dataTable').DataTable({
                columns: [{
                     data: 'name'
                }], 
                destroy: true,
           });

          $('#userType').trigger('change');
      };
});

基本上我已经在类的构造函数中声明了字段usersTable,它实际上包含DataTable 实例,然后init 方法创建DataTable 并保存实例。

初始化完成后,我触发userType 上的更改事件,该事件应将newData 行添加到存储在类中的usersTable

问题是没有添加数据。我看到如果我在UsersHelper 之外声明变量usersTable,那么不使用this.usersTable 一切正常。

我做错了什么?

【问题讨论】:

    标签: javascript jquery datatables


    【解决方案1】:

    根据official documentation

    当 jQuery 调用处理程序时,this 关键字是对 传递事件的元素;对于直接绑定的事件 这是附加事件并用于委托的元素 events 这是一个元素匹配选择器。 (请注意,这可能不是 如果事件从后代冒泡,则等于 event.target element.) 从元素创建一个 jQuery 对象,以便它可以 与 jQuery 方法一起使用,使用 $( this )。

    您的问题是由错误的this 范围引起的。在on 处理程序内部,jQuery 将this 绑定到导致当前事件的当前DOM 元素。所以你必须保存你类的 this 本地范围,然后在 on 处理程序中使用它而不是 this

    UsersHelper.prototype.init = function(){
           var that = this; // note this change
           this.initUserTable();
             $('#userType').on('change', function(){
                  let newData = [{ 'name': 'foo' }];
                  that.usersTable.row.add(newData); // use class context
             });
    
    
          };
    

    【讨论】:

    • 这不起作用,我尝试了您的解决方案,但正如您从我的代码中看到的那样,我将 this 绑定到事件处理程序。这很奇怪,因为如果我声明没有这个有效的表
    • 您是否尝试过调试此时that.usersTable的值?
    • 是的,奇怪的是实例实际上是定义的,所以我对此没有任何问题,只是没有添加数据
    • 你能在 jsfiddle 中重新创建这个问题吗?
    • 呵呵,终于解决了。添加数据后您忘记使用draw() 方法。根据add() method 的官方文档:请注意,要查看表格中的新行,您必须调用 draw() 方法,这可以通过 DataTables API 使用的链接轻松完成。
    猜你喜欢
    • 2022-01-18
    • 2020-02-03
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多