Javascript DataTables基于一个';s值
我正在尝试创建一个条件语句,它不仅将数据替换为我目标的列,还将替换基于所选目标值的第二个列的数据Javascript DataTables基于一个';s值,javascript,jquery,datatables,Javascript,Jquery,Datatables,我正在尝试创建一个条件语句,它不仅将数据替换为我目标的列,还将替换基于所选目标值的第二个列的数据 setTimeout(function() { $('#invoices-table').DataTable({ responsive: true, columnDefs: [{ orderable: false, targets: [-1, -2, -3] }, { targets: 0, // statement is based on first column
setTimeout(function() {
$('#invoices-table').DataTable({
responsive: true,
columnDefs: [{ orderable: false, targets: [-1, -2, -3] }, {
targets: 0, // statement is based on first column data
render: function(data, type) {
// if data in col0 is "1" then replace data in col0 and col5 (pay button)
if (type == 'display' && data == '1') {
return [
{ data: '<i class="fa fa-3 fa-check-circle-o datatable-paid-1"></i>', target: 0 },
{ data: '<button class="pay-btn btn btn-sm btn-success disabled">Paid</button>', target: 5 }
]
} else {
return [
{ data: '<i class="fa fa-3 fa-exclamation-circle datatable-paid-0"></i>', target: 0 }
]
}
},
}],
"lengthMenu": [
[100, 5, 25, 50, -1],
[100, 5, 25, 50, "All"]
],
dom: 'Bfrtip',
initComplete: function() {
var api = this.api();
// my actions upon complete
}
});
}, 1500); // delay is needed due to needed time of mySQL for passing results
setTimeout(函数(){
$(“#发票表”)。数据表({
回答:是的,
columnDefs:[{orderable:false,目标:[-1,-2,-3]}{
目标:0,//语句基于第一列数据
呈现:函数(数据、类型){
//如果col0中的数据为“1”,则替换col0和col5中的数据(付款按钮)
如果(类型='display'&&data='1'){
返回[
{数据:“”,目标:0},
{数据:'已支付',目标:5}
]
}否则{
返回[
{数据:“”,目标:0}
]
}
},
}],
“长度菜单”:[
[100, 5, 25, 50, -1],
[100,5,25,50,“全部”]
],
dom:'Bfrtip',
initComplete:function(){
var api=this.api();
//我的行动完成了
}
});
}, 1500); // 由于mySQL传递结果需要时间,因此需要延迟
编辑
由于错误的目标编号更新了post和codepen上的代码如果您按照前面的答案中的建议查看,则您将看到呈现
回调还有几个参数:
render: function ( data, type, full, meta ) {
columnDefs
中的每个部分都可以有多个目标,但是targets
指的是列索引,而不是数据!所以你有点搞错了。其含义是:您可以将相同的结果字符串传递给多个列,即在一个回调中使用例如复选框来处理列,但不能在同一columnDefs
节中区分目标(列)和不同的返回字符串。这没有多大意义,而且很难实施
从逻辑上讲,如果希望不同的列具有不同的值,则使用不同的columnDefs
节。full
参数保存行的所有值,因此即使您以列#14为目标,也可以使用full
检查列#0的值。以下是您应该做的:
columnDefs: [
{ orderable: false, targets: [-1, -2, -3] },
{ targets: 0,
render: function(data, type) {
if (type == 'display') {
return data == '1'
? '<i class="fa fa-3 fa-check-circle-o datatable-paid-1"></i>'
: '<i class="fa fa-3 fa-exclamation-circle datatable-paid-0"></i>'
} else {
return data
}
}
},
{ targets: 14,
render: function(data, type, full) {
if (type == 'display') {
return full[0] == '1'
? '<button class="pay-btn btn btn-sm btn-success disabled">Paid</button>'
: '<button class="pay-btn btn btn-sm btn-success">pay</button>'
} else {
return data
}
}
}
]
columnDefs:[
{orderable:false,目标:[-1,-2,-3]},
{目标:0,
呈现:函数(数据、类型){
如果(类型==“显示”){
返回数据==“1”
? ''
: ''
}否则{
返回数据
}
}
},
{目标:14,
呈现:函数(数据、类型、完整){
如果(类型==“显示”){
返回完整[0]=“1”
“付费”
:“支付”
}否则{
返回数据
}
}
}
]
正如您所描述的,我现在知道应该在哪个逻辑上工作了。PS:刚刚编辑了我的文章,我在发布的示例中有错误的目标编号,target:14
(第14列)到target:5
,如果您也可以为将来的读者更正的话;-)是否返回完整[0]=“1”?'Paid':data
一个正确的方法,以防在“1”不满足的情况下,我想保留应用程序在该列中默认生成的内容?嘿@VasilisKosmas,是的,我会这么认为。但是您也可以不使用pay
进行预渲染,因为列可能是空的,这将首先减少要加载的HTML。如果您有500行,您将使用60*500/1024==29kb.davidkonrad减少初始HTML。实际上,根据用户报告的搜索条件,行(从DB获取用于NodeJS应用程序)甚至超过500行,这就是为什么我必须将代码包装在setTimeout中,3000
因此数据表是在获取记录后启动的。必须显示“付款”按钮,因为它是一个操作按钮,用于在数据库中将当前发票/记录标记为“已付款”。