日期:2014-05-16  浏览次数:20720 次

ext-grid大量动态清除出现的Bug? - Web 开发 / Ajax
我使用ext-grid控件时:需要做删除操作时:我使用的是store的remove(record)方法,可是当一次性删除大量record时,比如一次需要删除10条以上:删除操作就会出现bug: grid显示控件上删除的record可能不是我选择的那些,我使用BufferedStore,
BufferedStore.js中对应的remove方法如下:
 remove : function(record)
  {
1 var index = this.data.indexOf(record);
   
2 if (index < 0) {
3 var ind = this.findInsertIndex(record);
4 this.totalLength -= 1;
5 if(this.pruneModifiedRecords){
6 this.modified.remove(record);
  }
7 this.fireEvent("remove", this, record, ind);
8 return false;
  }
9 this.data.removeAt(index);
10 if(this.pruneModifiedRecords){
11 this.modified.remove(record);
  }
   
12 this.totalLength -= 1;
13 this.fireEvent("remove", this, record, index);
14 return true;
  },
在9行中先清除了数据源data中的数据,13行则对页面控件发送清除事件,清除控件中对应记录的显示,
我考虑可能出现Bug的地方在13行:13行代码中fireEvent是用来清除控件中的record,
而传入的index则是记录对应的索引,可能fireEvent这个方法是异步的操作,而当大量删除记录时,可能出现
清除第一条记录的方法fireEvent还在执行,第二条清除记录又上报了,这个时候调用13行中的fireEvent("remove", this, record, index);这时的index可能还是第一次清除记录时的index(fireEvent方法尚未完成?),从而造成了页面上显示的不正确?关键:ext-grid是根据记录的index来清除页面上记录的,而在大量动态清除的情况下,index无法保证其准确性?

不知道哪位大侠能帮我指点迷津?

(如果每次清除完成后使用store的reload方法可以保证数据源和显示的是一致的,可是当大量的清除事件上报时,页面将不断的load,没法正常查看)

------解决方案--------------------
CSS code

var rs = this.getSelectionModel(). getSelections();//返回所选择的数据数组
var id = [];
for (var i....){
    this.getStore().remove(rs[i]);//删除store的数据
     id.push(rs[i].get("id"));//得到id添加id数组总
}
Ext.Ajax.request(...,params: id.jion(","),...);//将id发送到后台批量删除即可

你思路是每条记录都加一个事件进行删除,这样对大量数据不是很好。可以考虑将选择的数据先在前台删除
如果将删除的数据id发送到服务器端用ajax再进行删除。这样页面可以不刷新就完成删除了,也不需要reload

------解决方案--------------------
这个是BufferedStore的代码,你贴出你的代码看看