【发布时间】:2015-03-03 17:01:23
【问题描述】:
我正在处理带有远程数据的剑道网格,目前在更新网格时,我使用 dataItem.set() 方法手动将网格与数据同步。这工作正常,但不幸的是页脚中的聚合没有刷新。它们仅在调用 dataSource.fetch() 时刷新,这会使应用程序挂起大约 10 秒。然而,用户想要更多类似 excel 的响应能力,他们所做的每一项更改都会立即反映在总数中,但也会保留到数据库中。这可以使用剑道api吗?还是我必须使用 jQuery 手动执行此操作?
编辑:看起来没有内置方法,所以我使用 jQuery 手动修复。
编辑 2:这是我使用的代码,进行了一些概括并去掉了一些特定于应用程序的怪癖。
剑道网格配置:
$(gridId).kendoGrid({
columns: [
{
field: fieldToUpdate,
editor: customEditor,
//add 'data-field' attribute to footer/group footer
footerAttributes: { 'data-field': fieldToUpdate },
groupFooterAttributes: { 'data-field': fieldToUpdate }
},
//other fields...
],
//other config...
});
自定义编辑器:
function customEditor(data) {
//store original and new value
//append textbox
//call custom update passing td and data w/ original/new values
}
查找受影响的聚合单元:
//Gets all affected aggregate cells after an update
function getTotalsCells($container, updatedField) {
var groups = $('#grid').data('kendoGrid').dataSource.group(),
$totals = $('.k-footer-template>td[data-field="' + updatedField + '"]'),
$row = $container.parent('tr');
for (var i = 0; i < groups.length; i++) {
var $groupTotal = $row.nextAll('.k-group-footer')
.eq(i)
.find('[data-field="..."]');
$totals = $totals.add($groupTotal);
}
return $totals;
}
更新总计
$.fn.updateTotal = function (delta) {
this.each(function () {
var $container = $(this);
var origTotal = parseFloat($container.text() || 0);
var total = origTotal + delta;
$container.text(total);
});
};
自定义更新:
function updateGrid($container, data) {
var difference, field;
//get difference and updatedField
var $totals = getTotalsCells($container);
$totals.updateTotal(difference);
}
我觉得必须有更好的方法来做到这一点,但聚合模型似乎没有更新。
【问题讨论】:
-
你有一个例子说明你是如何用 jQuery 手动修复它的吗?
-
用示例代码编辑了我的问题。
-
感谢您的示例。我的做法有点不同。看我的回答。
-
聚合在一个可观察的集合上,不是吗?需要手动更新可观察事物的聚合,这让我感到很奇怪。如果它不更新依赖它的东西,那么让它可观察有什么意义?
标签: javascript jquery kendo-ui kendo-grid