我正在尝试遍历DataTable以获取两列的值,第一列包含ID和ID,第二列为数量,因此我可以创建要传递的数组,以使用数据库上的数量更新ID。我的代码返回“未定义”。我如何为每一行返回“ x”列中的值?
function disperse() {
memDispTable.rows().every(function() {
var row = this.data();
console.log(row[0]);
// Create array to send for updating
});
}
在数据表列0是:
{data: 'cdId',
visible: false,
searchable: false},
第6列(要更新的金额)是一个输入字段:
{data: null,
className: "center",
defaultContent: '<input class="ilValue" type="number" min="0" max="99999.99" step=".01" placeholder="0.00">'
},
的结果:
var row = this.data();
console.log(row);
是:
cdFirstName: "Tendon"
cdId: "MTQ5"
cdSurname: "Achilles"
grpId: "MQ=="
section: "Cub"
__proto__:
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
我现在遍历行。第一行包含一个金额:
但是,当我遍历Total时会返回另一行:
当我排序总计再次返回不同的行:
排序后,页面上的“总数”与正确的行保持一致(即Glyn Bartlett)。
我的代码是:
function postDispersements() {
//Disperse the amounts to each person
//Iterate through each row
memDispTable.rows().data().each( function ( rowData, index ) {
var scoutNo = rowData.scoutNumber;
var surname = rowData.cdSurname;
var firstName = rowData.cdFirstName;
var amtNode = memDispTable.cells(index, 7).nodes().to$()[0];//Total column
var amt = parseFloat($('input', amtNode ).val());
if (isNaN(amt)) {
amt = 0.0;
}
amt = (Math.floor((amt + Number.EPSILON) * 100) / 100).toFixed(2);
//There are a large number of records so only log the rows with an amount
if (amt > 0) {
console.log("scoutNo: " + scoutNo + " surname: " + surname + " firstName: " + firstName + " amt: " + amt);
}
});
}
修改后的答案:
您遍历行数据的函数memDispTable.rows().every(function() {...})
看起来不错。
但是,每一行中的数据结构可以是一个数组:
[ "value 1", "value2", "value3", ... ]
或对象:
{ field1: "value1", field2: "value2", field3: "value3", ... }
如果您不能使用数组索引访问行数据中的值(例如)row[0]
,则表明您需要使用字段名称访问数据:row.field1
。
您可以通过将整个行打印到控制台来仔细检查行的结构:
memDispTable.rows().every(function() {
var row = this.data();
console.log(row);
});
这将向您显示行结构-并且,如果它是一个对象,您还将看到需要使用的字段名称。
是否将行数据作为数组或对象,取决于首先如何将数据提供给DataTables。通常,它是通过JSON数据进行的-因此,它取决于该JSON的结构。
修订方法
根据问题中更新的信息,您将获得类似于以下示例的数据(用于两行测试数据):
[
{ "cdFirstName": "Tendon",
"cdId": "MTQ5",
"cdSurname": "Achilles",
"grpId": "MQ==",
"section": "Cub"
},
{ "cdFirstName": "John",
"cdId": "MTQ6",
"cdSurname": "Smith",
"grpId": "MQ==",
"section": "Cub"
}
]
这意味着您可以使用以下命令访问每一行中的值:
memDispTable.rows().every(function() {
var row = this.data();
console.log(row.cdId);
});
因此,您的评论非常接近this.row.cdId
-您只需要“本”部分。
但是,您还希望从每一行获取输入的金额-这需要一种不同的方法。由于金额是由用户手动输入到字段中的,因此该数据对于DataTables而言不是直接可见的-它是HTML表的一部分,而不是DataTables对象的一部分。
我们可以将上面的row()
迭代器与以前使用的相同技术结合起来,以跟踪总计的总分配量,从而获得所需的东西。
那将是这样的:
function disperse() {
memDispTable.rows().data().each( function ( rowData, index ) {
var amtNode = memDispTable.cells(index, 5).nodes().to$()[0];
var amt = parseFloat($('input', amtNode ).val());
if (isNaN(amt)) {
amt = 0.0;
}
console.log( "ID: " + rowData.cdId + ", amount: " + amt );
} );
}
这将遍历每个表行以获取cdId
值-位于DataTables中。
我们还使用一个cells(index, 5)
函数来获取当前行中的特定单元格(5)。然后,我们使用该nodes()
功能来帮助DataTables访问该特定单元格中用户输入的值。
放在一起,我们有类似的东西-如果您想尝试一下(然后适应您的特定代码),它应该作为独立的测试文件工作:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/big-integer/1.6.48/BigInteger.min.js"></script>
</head>
<body>
<div style="margin: 20px;">
<div id="showsum">Grand Total: $0.00</div>
<br><br>
<table id="demo" class="display dataTable cell-border" style="width:100%">
</table>
</div>
<script type="text/javascript">
var dataSet = [
{ "cdFirstName": "Tendon",
"cdId": "MTQ5",
"cdSurname": "Achilles",
"grpId": "MQ==",
"section": "Cub"
},
{ "cdFirstName": "John",
"cdId": "MTQ6",
"cdSurname": "Smith",
"grpId": "MQ==",
"section": "Cub"
}
];
var table;
function doSum() {
var sum = 0.0;
memDispTable.columns(5).nodes().to$()[0].forEach(function (item) {
var amt = parseFloat($('input', item ).val());
if (!isNaN(amt)) {
sum += amt;
}
});
sum = (Math.round((sum + Number.EPSILON) * 100) / 100).toFixed(2);
$('#showsum').text("Grand Total: $" + sum);
disperse();
}
function disperse() {
memDispTable.rows().data().each( function ( rowData, index ) {
var amtNode = memDispTable.cells(index, 5).nodes().to$()[0];
var amt = parseFloat($('input', amtNode ).val());
if (isNaN(amt)) {
amt = 0.0;
}
console.log( "ID: " + rowData.cdId + ", amount: " + amt );
} );
}
$(document).ready(function() {
memDispTable = $('#demo').DataTable( {
"data": dataSet,
"columns": [
{ title: "ID", "data": "cdId", "visible": false, "searchable": false },
{ title: "First Name", "data": "cdFirstName" },
{ title: "Surname", "data": "cdSurname" },
{ title: "Group", "data": "grpId" },
{ title: "Section", "data": "section" },
{ title: "Amount" }
],
"columnDefs": [ {
"targets": 5,
"name": "amt",
"data": function ( row, type, val, meta ) {
return '<input type="number" min="0" max="99999.99" step=".01" placeholder="0.00" onchange="doSum()">';
}
} ]
} );
disperse();
} );
</script>
</body>
</html>
此演示将以下内容打印到控制台:
ID: MTQ5, amount: 0
ID: MTQ6, amount: 0
随着金额的更改,打印输出显示更改:
ID: MTQ5, amount: 1.23
ID: MTQ6, amount: 456.78
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句