Reputation: 2082
I want to render a datatable, but depending on the value of some variable the content will slightly change.
Ideally I would like to do something like this, to re-use some part of the code:
var DT1 = $('#myTable').DataTable( {
ajax: {
url: 'ajax_search',
type: 'GET',
data: {},
dataSrc: "",
},
if (value == 'X'){
columns: [
{"data": "fields.X1"},
{"data": "fields.X2"},
],
columnDefs: [
{ className: 'text-center', targets: [1] },
{
targets: [0],
class: 'text-center',
orderable: true,
render: function (data, type, row) {
var button1 = '<a href="/x_page/" target="_blank"><u>'+data+'</u></a>';
return button1;
}
},
],
} else{
columns: [
{"data": "fields.Y1"},
{"data": "fields.Y2"},
],
columnDefs: [
{ className: 'text-center', targets: [1] },
{
targets: [0],
class: 'text-center',
orderable: true,
render: function (data, type, row) {
var button2 = '<a href="/y_page/" target="_blank"><u>'+data+'</u></a>';
return button2;
}
},
],
}
order: [
[0, 'asc']
],
"pagingType": "numbers",
dom: 'rtp',
});
But it does not work.
Basically I just want to modify the columns
and the columnDefs
part based on some logic, the other parts will be the same in all the cases.
Is there a way to do that and reduce some code?
Right now the way I have this implemented is as follows (working, but probably not best practice):
if (condition1) {
// Entire table definition with all the code for condition1, without reusing any code
} else if (condition2) {
// Entire table definition with all the code for condition2, without reusing any code
} else {
// Entire table definition with all the code for conditionN, without reusing any code
}
But it seems extremely inefficient to me, isn't there a way to do it and reuse the common parts of the code?
Upvotes: 0
Views: 1871
Reputation: 1510
When you use the function (row, type, val, meta)
syntax for the columns.data
initialization option, the row
argument automatically receives the AJAX data of each row.
$('#example').DataTable({
"columns": [
{ "data": function(row) {
if(condition1) {
return row.fieldX;
} else if(condition2) {
return row.fieldY;
} else {
// etc.
}
}
}
]
})
Anyway, you can see examples in the docs page I linked before
You can also look at this updated JSFiddle that uses both columns
and columnDefs
.
Upvotes: 1