Javascript jQuery DataTable-更新值并呈现到HTML表
我有一个jQuery DataTable对象,它保存日志信息——在某个日期范围内,应用程序记录了多少异常、信息等类型的日志消息。我想在日志消息发送到底层数据库时更新这些值。我目前正在使用javascript根据AppId在HTML表中查找一个单元格,并使用新的日志总数更新innerHTML。但是,由于并非所有应用程序都可见,例如,如果有15个应用程序,但该表仅设置为显示10个条目,因此我希望更新DataTable对象中的值,以便在应用程序包含在表中时,这些值是正确的 我尝试过通过这样做来更改DataTable中的值Javascript jQuery DataTable-更新值并呈现到HTML表,javascript,datatables,Javascript,Datatables,我有一个jQuery DataTable对象,它保存日志信息——在某个日期范围内,应用程序记录了多少异常、信息等类型的日志消息。我想在日志消息发送到底层数据库时更新这些值。我目前正在使用javascript根据AppId在HTML表中查找一个单元格,并使用新的日志总数更新innerHTML。但是,由于并非所有应用程序都可见,例如,如果有15个应用程序,但该表仅设置为显示10个条目,因此我希望更新DataTable对象中的值,以便在应用程序包含在表中时,这些值是正确的 我尝试过通过这样做来更改Da
var rows = table.rows().data();
var arr = data.aaData;
for (var i = 0; i < arr.length; i++) {
for (var r = 0; r < rows.length; r++) {
if (arr[i].ApplicationId == rows[r].AppId) {
if (arr[i].Debug != 0 || arr[i].Information != 0 || arr[i].Message != 0 || arr[i].Warning != 0 || arr[i].Exception != 0) {
//New Exception Count
if (arr[i].Exception !== 0) {
rows[r].Exception = arr[i].Exception;
flash(rows[r].AppId, 'Exception');
}
//New Warning Count
if (arr[i].Warning !== 0) {
rows[r].Warning = arr[i].Warning;
flash(rows[r].AppId, 'Warning');
}
//New Message Count
if (arr[i].Message !== 0) {
rows[r].Message = arr[i].Message;
flash(rows[r].AppId, 'Message');
}
//New Information Count
if (arr[i].Information !== 0) {
rows[r].Information = arr[i].Information;
flash(rows[r].AppId, 'Information');
}
//New Debug Count
if (arr[i].Debug !== 0) {
rows[r].Debug = arr[i].Debug;
flash(rows[r].AppId, 'Debug');
}
}
}
}
}
table.draw();
var rows=table.rows().data();
var arr=data.aaData;
对于(变量i=0;i
其中,data.aaData
是从控制器方法返回的JSON格式数据。
将行
记录到控制台中,我可以看到DataTable对象中的值已更新,但在table.draw()调用期间,这些新值不会呈现到HTML表中
那么,有人有标准的方法来更改数据表中的值吗?我试过使用table.cell(r,5).data(someNewValue)例如,code>但这似乎会产生一些不可靠的结果。奇怪的是,您尝试使用table.cell(r,5).data(someNewValue)
的操作无效。无论如何,你当然可以走另一条路。这里的关键词是使用。如果我们有一张桌子:
还有一些JSON格式的数据
var数据=[
{“姓名”:“大卫”,“姓氏”:“康拉德”}
];
然后像这样初始化数据表
var table=$('#示例')。数据表({
数据:数据,
栏目:[
{数据:“名称”,标题:'name'},
{数据:“姓氏”,标题:“姓氏”}
]
})
然后,您可以通过以下方式更新data
JSON来更改数据表的内容:
数据[0]。名称='sam';
数据[0]。lastname='gregory';
table.row(0).invalidate().draw();
针对特定行,或仅针对
table.rows().invalidate().draw();
对于整个数据集
演示->
更新。您可以使用AJAX数据源执行与上述完全相同的操作:
$('#example').DataTable( {
ajax: {
url: "someUrl",
dataSrc: function(json) {
//manipulate the data JSON as you wish
//in this case, you dont need to invalidate() or draw()
//...
return json.data;
}
})
更新II。在呈现表之后操作AJAX数据。只需将响应JSON“复制”到稍后可以操作的变量。变量只是一个引用。一个小例子:
var data;
var table = $("#example").DataTable({
ajax : {
url : 'data.json',
dataSrc : function(json) {
data = json.data;
return json.data;
}
},
columns : [
{ data : 'first_name' }
]
})
setTimeout(function() {
data[0].first_name = 'sam';
table.row(0).invalidate().draw();
}, 100)
结果与我的第一个示例完全相同 您是如何将更改提交到数据库的?唯一的问题是,我正在使用对控制器方法的ajax调用来填充表,因此无法更新JSON数据。我已尝试更新table.rows().data()对象中的数据,然后调用table.row(row).invalidate().draw()代码>但这似乎不起作用either@sam.gregory91,如果您也使用AJAX数据源,则可以更新/操作JSON。将dataSrc
定义为一个函数,其中param是来自AJAX调用的JSON响应,然后可以在dataTable呈现它之前对其进行操作。请参阅update。唯一的问题是我需要在创建表之后处理和更新它rendered@sam.gregory91,是的,还有。。?见更新二。我认为你把问题复杂化了。绝对没有区别。只需将响应保存在一个变量中,这个变量实际上只是对dataTables使用的原始JSON的引用。当您稍后处理此引用时,您也在处理dataTables数据集。update II中的超时只是为了进行延迟,否则代码将在dataTables完成其业务之前执行。在你的情况下,这并不重要,因为你有一个完整的更新函数,你稍后会在某一点上发出声音。你是对的,我把问题复杂化了。作为javascript的新手,我在变量范围上犯了错误。我现在可以访问和操作数据,但是在将dataSrc
添加到ajax调用后,从$(“#myTable”)返回的DataTable对象是不同的,即。所有的功能都改变了。