如何更新 w2ui 网格摘要单元格?
How do you update a w2ui grid summary cell?
我有一个网格,我需要在其中显示一列中所有数字的总和。网格中的数字是 editable,总和需要随着数字的变化而更新(在保存之前)。我有多个问题。相关代码如下所示,here is a jsfiddle 如果您想浏览一个功能正常的程序。
$(function() {
$('#grid').w2grid({
name: 'grid',
columns: [{
field: 'recid', caption: 'ID', size: '50px', sortable: true, attr: 'align=center'}, {
field: 'lname', caption: 'Last Name', size: '150px', sortable: true },
{field: 'amount', caption: 'Amount', size: '100px', render: 'money', editable: { type: 'money' }},
],
records: [{
recid: 1, fname: 'Jane', amount: 1000.00}, {
recid: 2, fname: 'Stuart', amount: 1000.00}, {
recid: 3, fname: 'Jin', amount: 1000.00}, {
recid: 's-1', fname: '', amount: 0, w2ui: {summary: true}}
]
});
w2ui.grid.on('change', function(event) {
event.done(function () {updateTotal(); });
});
w2ui.grid.on('refresh', function(event) { updateTotal(); });
w2ui.grid.on('render', function(event) {updateTotal(); });
});
function updateTotal() {
var total = 0.0;
for (var i = 0; i < w2ui.grid.records.length; i++) {
if (typeof w2ui.grid.records[i].amount == "number") {
total += w2ui.grid.records[i].amount;
}
}
w2ui.grid.get('s-1').amount = total;
w2ui.grid.refreshCell('s-1','amount');
document.getElementById("gridtotal").innerHTML = '' + w2ui.grid.summary[0].amount + '<br>w2ui.grid.records[0].amount = ' + w2ui.grid.records[0].amount;
}
第一个问题 -- 未显示对摘要行的更新。我有 onChange、onRefresh 和 onRender 处理程序。他们包装了对 updateTotal() 的调用,它在每条记录中添加 'amount' 并将结果存储在摘要记录的金额字段中。金额更改后,我调用 refreshCell。但是 none 的处理程序在网格的初始显示发生时被调用 - 因此汇总记录显示 0。当网格初始显示时应该调用什么来更新汇总量?
第二个问题 -- updateTotal() 在错误的单元格中显示结果。单击按钮执行 updateTotal()。 3000 的总和对于处于初始状态的 table 是正确的。您可以从更新 innerHTML 的行中看到摘要记录 ('s-1') 在其 'amount' 字段中更新为正确的值,并且我们调用 refreshCell('s-1','amount').但是在网格上,recid 1 的 'amount' 单元格被更新为显示 3000(请注意它呈现为左对齐而不是右对齐)。为什么会这样?我应该调用什么来更新摘要行中的 'amount' 单元格?
第三个问题 -- 当用户对 'amount' 单元格进行更改(双击以更改数量)时,会发生 onChange 事件,从而导致计算新的总计。但是用户所做的更改在网格记录中不可用。更改保存在不同的位置。因此,新计算的总数与用户在网格上看到的数字不对应。在保存更新之前,新值在记录 (records[i].amount) 中不可用。但是我需要在保存更改之前访问网格中显示的金额。如何访问更改后的值?
要修改现有记录,您需要使用 set
方法 - 使用 get
您 不是 获得参考,而是副本!
w2ui.grid.set('s-1', {amount: total});
关于您的第一个问题:您在网格已呈现后分配呈现回调。您需要在构造函数中分配回调:
$('#grid').w2grid({
onRender: ....
});
当您使用 set
而不是 get 时,您的第二个问题应该不再是问题。
关于你的第三个问题:在你保存更改之前,更改存储在 record.w2ui.changes
- 所以要么调用 grid.save()
要么从更改中获取金额,而不是从原始记录中获取金额。
已更新fiddle:
我有一个网格,我需要在其中显示一列中所有数字的总和。网格中的数字是 editable,总和需要随着数字的变化而更新(在保存之前)。我有多个问题。相关代码如下所示,here is a jsfiddle 如果您想浏览一个功能正常的程序。
$(function() {
$('#grid').w2grid({
name: 'grid',
columns: [{
field: 'recid', caption: 'ID', size: '50px', sortable: true, attr: 'align=center'}, {
field: 'lname', caption: 'Last Name', size: '150px', sortable: true },
{field: 'amount', caption: 'Amount', size: '100px', render: 'money', editable: { type: 'money' }},
],
records: [{
recid: 1, fname: 'Jane', amount: 1000.00}, {
recid: 2, fname: 'Stuart', amount: 1000.00}, {
recid: 3, fname: 'Jin', amount: 1000.00}, {
recid: 's-1', fname: '', amount: 0, w2ui: {summary: true}}
]
});
w2ui.grid.on('change', function(event) {
event.done(function () {updateTotal(); });
});
w2ui.grid.on('refresh', function(event) { updateTotal(); });
w2ui.grid.on('render', function(event) {updateTotal(); });
});
function updateTotal() {
var total = 0.0;
for (var i = 0; i < w2ui.grid.records.length; i++) {
if (typeof w2ui.grid.records[i].amount == "number") {
total += w2ui.grid.records[i].amount;
}
}
w2ui.grid.get('s-1').amount = total;
w2ui.grid.refreshCell('s-1','amount');
document.getElementById("gridtotal").innerHTML = '' + w2ui.grid.summary[0].amount + '<br>w2ui.grid.records[0].amount = ' + w2ui.grid.records[0].amount;
}
第一个问题 -- 未显示对摘要行的更新。我有 onChange、onRefresh 和 onRender 处理程序。他们包装了对 updateTotal() 的调用,它在每条记录中添加 'amount' 并将结果存储在摘要记录的金额字段中。金额更改后,我调用 refreshCell。但是 none 的处理程序在网格的初始显示发生时被调用 - 因此汇总记录显示 0。当网格初始显示时应该调用什么来更新汇总量?
第二个问题 -- updateTotal() 在错误的单元格中显示结果。单击按钮执行 updateTotal()。 3000 的总和对于处于初始状态的 table 是正确的。您可以从更新 innerHTML 的行中看到摘要记录 ('s-1') 在其 'amount' 字段中更新为正确的值,并且我们调用 refreshCell('s-1','amount').但是在网格上,recid 1 的 'amount' 单元格被更新为显示 3000(请注意它呈现为左对齐而不是右对齐)。为什么会这样?我应该调用什么来更新摘要行中的 'amount' 单元格?
第三个问题 -- 当用户对 'amount' 单元格进行更改(双击以更改数量)时,会发生 onChange 事件,从而导致计算新的总计。但是用户所做的更改在网格记录中不可用。更改保存在不同的位置。因此,新计算的总数与用户在网格上看到的数字不对应。在保存更新之前,新值在记录 (records[i].amount) 中不可用。但是我需要在保存更改之前访问网格中显示的金额。如何访问更改后的值?
要修改现有记录,您需要使用 set
方法 - 使用 get
您 不是 获得参考,而是副本!
w2ui.grid.set('s-1', {amount: total});
关于您的第一个问题:您在网格已呈现后分配呈现回调。您需要在构造函数中分配回调:
$('#grid').w2grid({
onRender: ....
});
当您使用 set
而不是 get 时,您的第二个问题应该不再是问题。
关于你的第三个问题:在你保存更改之前,更改存储在 record.w2ui.changes
- 所以要么调用 grid.save()
要么从更改中获取金额,而不是从原始记录中获取金额。
已更新fiddle: