我正在研究Kendo Grid上的功能。有一个表,每行都有一个复选框,有一个Select All
检查所有复选框的选项,并且该行旁边的Select All
选项旁边有一个按钮Update All
,当您单击Update All
它会更新Status
网格中所选行的数量,但是它尚未在数据库上更新。要更新数据库上的那些行,您必须单击一个Save Changes
按钮。我遇到的问题是,当我单击Update All
按钮时,性能超过100行时非常非常慢,我知道为什么,Javascript
这是使步骤非常慢的代码:
var items = $('#grid').data().kendoGrid.dataSource.data();
$.each(selectedRows, function (index, r) {
var indexOf = rows.indexOf(r);
var item = items[indexOf];
item.set('STATUS', status); //This line of code is very slow for more than 100 records
});
因此,当有300条以上的记录时,Chrome变得无响应,因此使用set方法会使此过程非常缓慢。所以我将其更改为:
var items = $('#grid').data().kendoGrid.dataSource.data();
$.each(selectedRows, function (index, r) {
var indexOf = rows.indexOf(r);
var item = items[indexOf];
item.STATUS = status; //It works fast now
});
kendoGrid.refresh();
网格在前端正确更新,但是当我单击Save Changes
不应该将那些记录保存在数据库上的控制器时,未调用,这是因为Status
使用最后一种语法时未检测到列上的更改。之间的差异
item.set('STATUS', status);
和
item.STATUS = status;
kendoGrid.refresh();
为什么在第二步中使用该set()
方法将行保存到数据库中,但是当我使用item.STATUS = status;
并单击Save Changes
具有更改的行时却未根据请求发送呢?
所以我找到了这个答案:https : //stackoverflow.com/a/20959758/5614045 并更新了我的语法如下:
var items = $('#grid').data().kendoGrid.dataSource.data();
$.each(selectedRows, function (index, r) {
var indexOf = rows.indexOf(r);
var item = items[indexOf];
item.STATUS = status; //It works fast now
item.dirty = true; //Added this line of code.
});
kendoGrid.refresh();
现在可以正常工作了,显然有一个dirty
标志,当设置为true时,表示项目已更改...