【问题标题】:DataTables, es6 arrow functions and thisDataTables、es6 箭头函数和 this
【发布时间】:2019-02-19 08:10:04
【问题描述】:

我有以下datatables 初始化,其中我使用preDrawCallback 函数根据表中的记录数隐藏和显示分页和过滤器。

由于它是 webpack 项目的一部分,我已将其转换为 es6,但我不得不禁用该函数的对象简写,因为我无法在不使用 this 的情况下找到获取当前表的方法:

$tables.DataTable({
  preDrawCallback: function(settings) { // eslint-disable-line object-shorthand

    const $table = $(this); // is there a way to get this table without using this?
    
    // rest of code
  }
})

查看了大量文档后,似乎没有将参数传递给我可以获取该表的函数,并且所有示例都使用 $(this)

我的问题是我必须使用它还是有其他方法可以获取表格以便我可以将命名函数更改为箭头函数?

更新

似乎我看错了问题,毕竟不需要使用箭头函数,修复 lint 错误解决了不使用 this 的需要(请参阅下面的答案),但以防万一有人不使用不想使用this,在控制台记录了很多不同的东西后,我发现当前表ID保存在传入的设置中,所以你可以这样做

$(`#${settings.sTableId}`).DataTable();

【问题讨论】:

  • 但是您可以轻松地使用箭头函数并获取表实例。需要this 的唯一原因是使用api,即this.api() 等于$(settings.oInstance.init().selector).DataTable() ...
  • 啊,对了,我使用了 api:new $.fn.dataTable.Api(settings);,但看不到任何从该 api 获取表格的方法——这让我感到困惑,因为 api 有一个 .table()——没有意识到设置实际上也在当前表上保存了大量信息
  • preDrawCallback:(settings) => { const $table = $(settings.oInstance.init().selector).DataTable() }
  • 啊是的,只有在有一张桌子的情况下才有效 - 请参阅:jsfiddle.net/v48gcn9r/1
  • 我的立场是正确的!应该使用$('#'+settings.sTableId).DataTable()

标签: javascript jquery ecmascript-6 datatables arrow-functions


【解决方案1】:

如您所说,如果该值未作为参数传入,那么您将需要使用普通函数。普通函数和箭头函数对this 有不同的行为,因此您需要为工作选择正确的工具。

至于您看到的 lint 错误,这与箭头函数没有任何关系。它只是告诉你这样写:

$tables.DataTable({
  preDrawCallback(settings) { // <-- using shorthand on this line
    const $table = $(this); 

    // rest of code
  }
});

【讨论】:

  • 啊我想知道为什么这个错误不是使用箭头函数错误,从来不知道你可以做这样的回调,太好了。谢谢!
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 2015-03-17
  • 2016-11-04
  • 2019-01-06
  • 1970-01-01
  • 2022-11-27
相关资源
最近更新 更多