rows().every() not working
rows().every() not working
rf1234
Posts: 2,987Questions: 87Answers: 421
Hi, I have this rather simple table and want to manipulate the column cashflowAccum in every row. The problem is that rows().every() never executes. The 'init' event gets triggered correctly. Please help!
var cashFlowTable = $('#tblCashFlow').DataTable({
dom: "Bfrltip",
ajax: {
url: 'actions.php?action=tblCashFlow',
type: 'POST',
data: function (d) {
var selected = contractTable.row({selected: true});
if (selected.any()) {
d.contract_id = selected.data().contract.id;
}
}
},
pageLength: 50,
lengthMenu: [5, 10, 20, 50, 100, 200, 500],
columns: [
{data: "cashFlowElement",
render: function (data, type, row) {
return renderCashFlowElement(data);
}
},
{data: "cashflow.start_date",
render: function (data, type, row) {
return renderCashFlowStartDate(row.cashflow.start_date,
row.cashflow.end_date,
row.cashflow.rate,
row.cashflow.is_fee);
}
},
{data: "cashflow.end_date"},
{data: "cashflow.amount_remaining",
render: function (data, type, row) {
return renderAmountCurrency(data, row.cashFlowCurrency);
}
},
{data: "cashflow.rate",
render: function (data, type, row) {
return renderCashFlowRate(row.cashflow.start_date,
row.cashflow.end_date,
row.cashflow.rate,
row.cashflow.is_fee);
}
},
{data: "cashflow.repayment",
render: function (data, type, row) {
return renderAmountCurrency(data, row.cashFlowCurrency);
}
},
{data: "cashflow.interest_fee",
render: function (data, type, row) {
return renderAmountCurrency(data, row.cashFlowCurrency);
}
},
{data: "cashflowTotalAmount",
render: function (data, type, row) {
return renderAmountCurrency(data, row.cashFlowCurrency);
}
},
{data: "cashflowAccum",
render: function (data, type, row) {
if (data !== '') {
return renderAmountCurrency(data, row.cashFlowCurrency);
} else {
return data;
}
}
},
{data: null, //manual and date_change
render: function (data, type, row) {
return renderManual(row);
}
}
],
columnDefs: [
{type: 'formatted-num', targets: [3, 5, 6, 7]},
],
order: [[2, 'asc']],
select: {
style: 'os',
selector: 'tr.selectRow td:not(:first-child)'
},
buttons: [
{extend: "edit", editor: cashFlowEditor},
{extend: "editDates", editor: cashFlowDatesEditor},
"colvis"
],
rowCallback: function (row, data) {
if ( data.cashflow.manual > 0 || data.cashflow.date_change > 0 ) {
$(row).addClass('fontThick');
}
//if it is not the summation row the row should be selectable
if ( ( data.cashflow.start_date !== data.cashflow.end_date &&
data.cashflow.rate !== '0,0000' &&
data.cashflow.rate !== '0.0000' ) ||
data.cashflow.is_fee > 0 ) {
$(row).addClass('selectRow');
}
}
});
cashFlowTable
.on('init', function () {
cashFlowTable.rows().every(function (rowIdx, tableLoop, rowLoop) {
var data = this.data();
if (rowIdx <= 0) {
data.cashflowAccum = 0;
}
data.cashflowAccum += data.cashflowTotalAmount;
this.invalidate();
});
cashFlowTable.draw();
});
This discussion has been closed.
Replies
by the way this table is one of multiple tables that I have on that page. But I read this shouldn't matter ... I tried with a stand alone table. I have on a different page. There it worked immediately. If you have any advice how to handle this issue having multiple tables this would really help.
Found it myself ... As you can see above this is a child table. it is only shown when a row of the parent table is being selected. On select of a row of the parent table I do this now:
Works now; problem solved.
Well, not quite ... that wasn't a good solution. Since I do all the number rendering on the server side I needed to convert everything to float and then back again. I ended up not changing anything about my existing ajax.reloads. All I did was to add a draw event on the respective table:
And this is the function that I call: