Javascript jQuery DataTable-更新值并呈现到HTML表

Javascript jQuery DataTable-更新值并呈现到HTML表,javascript,datatables,Javascript,Datatables,我有一个jQuery DataTable对象,它保存日志信息——在某个日期范围内,应用程序记录了多少异常、信息等类型的日志消息。我想在日志消息发送到底层数据库时更新这些值。我目前正在使用javascript根据AppId在HTML表中查找一个单元格,并使用新的日志总数更新innerHTML。但是,由于并非所有应用程序都可见,例如,如果有15个应用程序,但该表仅设置为显示10个条目,因此我希望更新DataTable对象中的值,以便在应用程序包含在表中时,这些值是正确的 我尝试过通过这样做来更改Da

我有一个jQuery DataTable对象,它保存日志信息——在某个日期范围内,应用程序记录了多少异常、信息等类型的日志消息。我想在日志消息发送到底层数据库时更新这些值。我目前正在使用javascript根据AppId在HTML表中查找一个单元格,并使用新的日志总数更新innerHTML。但是,由于并非所有应用程序都可见,例如,如果有15个应用程序,但该表仅设置为显示10个条目,因此我希望更新DataTable对象中的值,以便在应用程序包含在表中时,这些值是正确的

我尝试过通过这样做来更改DataTable中的值

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)但这似乎会产生一些不可靠的结果。

奇怪的是,您尝试使用
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对象是不同的,即。所有的功能都改变了。