【问题标题】:jQuery DataTable - Update values and render to HTML tablejQuery DataTable - 更新值并呈现到 HTML 表
【发布时间】:2015-12-15 13:26:32
【问题描述】:

我有一个 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();

其中data.aaData 是从控制器方法返回的 JSON 格式数据。 将rows 记录到控制台我可以看到DataTable 对象中的值已更新,但在table.draw() 调用期间这些新值并未呈现到HTML 表中。

那么有没有人有一个标准的方法来更改 DataTable 中的值?例如,我尝试过使用table.cell(r, 5).data(someNewValue);,但这似乎会产生一些不可靠的结果。

【问题讨论】:

  • 如何将更改提交到数据库?

标签: javascript datatables


【解决方案1】:

奇怪的是,table.cell(r, 5).data(someNewValue) 的尝试不起作用。无论如何,你当然可以反过来。这里的关键字是使用invalidate()。如果我们有一张桌子:

<table id="example"></table>

还有一些 JSON 格式的数据

var data = [
    { "name" : "david", "lastname" : "konrad" }
];

并像这样初始化数据表

var table = $('#example').DataTable({ 
    data : data,
    columns : [
        { data : "name", title :'name' },
        { data : "lastname", title : 'last name' }
    ]
})

然后您可以通过这种方式更新data JSON 来更改数据表的内容:

data[0].name = 'sam';
data[0].lastname = 'gregory';

table.row(0).invalidate().draw();

对于特定的行,或者只是

table.rows().invalidate().draw();

对于整个数据集。

演示 -> http://jsfiddle.net/vvzvxarf/


更新。您可以使用 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;
    }
})

更新二表渲染之后操作 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();,但这似乎也不起作用
  • @sam.gregory91,如果您也使用 AJAX 数据源,则可以更新/操作 JSON。将 dataSrc 定义为一个函数,其中参数是来自 AJAX 调用的 JSON 响应,然后您可以在 dataTable 呈现它之前对其进行操作。查看更新。
  • 唯一的事情是我需要在 渲染表之后操作和更新这个
  • @sam.gregory91,是的 - 和..?见更新二。我认为你把问题复杂化了。绝对没有区别。只需将响应保存在一个变量中,这个变量实际上只是对 dataTables 使用的原始 JSON 的引用。当您稍后处理此参考时,您也在处理 dataTables 数据集。 update II 中的 timeout 只是为了做一个延迟,否则代码会在 dataTables 完成之前执行。在你的情况下,这并不重要,因为你有一个完整的更新功能,你稍后会在某个点上调用。
  • 你说得对,我把问题复杂化了。作为 javascript 的新手,我在变量范围方面犯了错误。我现在可以访问和操作数据,但是在将 dataSrc 添加到 ajax 调用之后,从 $('#myTable').DataTable() 返回的 DataTable 对象是不同的,即所有的功能都变了。
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2020-12-18
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多