javascript - 包装一系列闭包

标签 javascript datatables monkeypatching

我继承了一大段代码,其中包含大量 DataTable 渲染器数组。我想在前面的数据对象中插入一些额外的数据,而不重写所有渲染器,只重写那些实际受影响的渲染器。

columnDefs 字段被生成为具有render 函数的对象数组,通常还有其他字段(targets类型等)。我想即时重写它,让 render 函数成为调用原始函数的包装器。我找不到正确的代码来关闭原始函数,因此我可以在处理过程中修改数据并仍然调用该原始函数。

例如,给定一个 columnDefs 为:

var columnDefs = [
{
  "render": function (data, type, row) {
    return stuff(row[3]);
  },
  "targets": 2
},
{
  "render": function (data, type, row) {
    return stuff(row[0]);
  },
  "targets": 1
},
// etc.
]

我正在尝试做这样的事情:

var mapper = function (def) {
    (function (d, old_render) {
        d.render = (data, type, row) => {
            let extra_data = undefined;
            if (row.length > 1 && typeof (row[0]) == 'object') {
                extra_data = row[0];
                row = row.slice(1);
            }
            return old_render(data, type, row, extra_data);
        }
    })(def, def.render);
};
columnDefs.forEach(mapper);

在调用 $("#my-datatable").DataTable({ ..., columnDefs: columnDefs, ... }) 之前。

目前的工作是调用新的渲染函数。然而,当 render 被调用时,old_render 一直是未定义的,这当然会死掉。

完整代码示例 on JSFiddle为了方便,也在这里:

function stuff(x) {
  return "<b>" + x + "</b>";
}

var columnDefs = [
{
  "render": function (data, type, row) {
    return stuff(row[3]);
  },
  "targets": 2
},
{
  "render": function (data, type, row) {
    return stuff(row[0]);
  },
  "targets": 1
},
]

var dataSource = [{"a", "b", "c", "d", "e"}, {"f","g","h","i","j"}];
columnDefs.forEach(d => {
  d.render = function(old_render) {
    return (data, type, row) => {
      let extra_data = undefined;
      return old_render(data, type, row.map(, extra_data);
    };
  }(d.render);
});
var table = $("#my-table").DataTable({
processing: true,
data: dataSource,
columnDefs: columnDefs
});

关联的 HTML 只是:

<link href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>

<p>
hello
</p>
<table id="my-table">
<thead>
  <tr>
    <th>1</th><th>2</th><th>3</th><th>4</th>
  </tr>
</thead>
</table>

更新... JSLint 正在运行,我只是不确定为什么它不在我的较大代码库中。我想回到绘图板,找出原因。

最佳答案

像这样的东西应该有用...

function newRender(oldRender, data, type, row) {
    let extra_data = undefined;
    if (row.length > 1 && typeof (row[0]) == 'object') {
        extra_data = row[0];
        row = row.slice(1);
    }
    return oldRender(data, type, row, extra_data);
}

var mapper = function (def) {
    def.render = newRender.bind(null, def.render);
};

columnDefs.forEach(mapper);

关于javascript - 包装一系列闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56959944/

相关文章:

python - 使用元类替代类定义?

javascript - 如何增加 highcharts.js 中两个条形之间的宽度

javascript - Magento 2在select.html中调用自定义库

javascript - 语法错误 : Failed to execute 'querySelector' on 'Document' : '[object HTMLDocument]' is not a valid selector

javascript - 如何向数据表标题添加额外的过滤器?

javascript - ReactJS,axios 响应未正确发送到我的数据集

jquery - DataTables 和 moment.js 未正确按日期排序

javascript - 如何使用按钮调用javascript函数和代码

python - 当原始类的实例由另一个类的方法生成时,如何处理子类?

python - 让 pytest 中的 monkeypatching 工作