我继承了一大堆代码,其中包含一大堆DataTable
渲染器数组。我想在前端的数据对象中插入一些额外的数据,而不重写所有渲染器,仅重写那些实际受影响的渲染器。
columnDefs
字段被生成为具有render
函数的对象数组,并且通常是其他字段(targets
,type
等)。我想即时重写此代码,以使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
时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正在运行,我不确定为什么它不在我的较大代码库中。我想回到绘图板上,找出原因。
答案 0 :(得分:1)
类似的事情应该起作用...
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);
答案 1 :(得分:1)
结果是,如果某些记录没有输入呈现器,那么当然不能调用旧的呈现器。此处要处理的列数足够大,以至于我没有注意到其中一些没有渲染器。
var columnDefs = [
{
"render": function (data, type, row) {
return stuff(row[3]);
},
"targets": 2
},
{
//"render": function (data, type, row) {
// return stuff(row[0]);
//},
"targets": 1
},
]
现在,当代码到达此处的第二列时,没有渲染函数,因此当然是未定义的。通过用if (d.render) {...}
包裹映射器,从而避免了这个问题。