ext的grid中如果对一条记录进行更新操作,grid选中项不会改变解决方案

来源:互联网 发布:中国远程网络教育网 编辑:程序博客网 时间:2024/06/10 04:03

在使用ext grid的过程中,修改了一条记录,grid数据重新加载了,但是选中项的值并没有改变,如何处理呢,有两种方案

第一种:

更新数据后对grid的SelectionModel进行清空处理

代码: grid.getSelectionModel().deselectAll();

第二种:

经过分析我觉得可能是grid中的SelectionModel中的记录并没有改变,所以才会到这这样的情况,正常流程应该是store重新加载后,需要更新SelectionModel中选中的记录。

于是查看Ext.selection.Model的源码,找到为store绑定事件的方法getStoreListeners,方法内容如下。

getStoreListeners: function() {        var me = this;        return {            add: me.onStoreAdd,            clear: me.onStoreClear,            bulkremove: me.onStoreRemove,            update: me.onStoreUpdate,            load: me.onStoreLoad,            idchanged: me.onModelIdChanged,            refresh: me.onStoreRefresh        };    },

发现监听了store的load事件,于是猜想问题应该出在onStoreLoad方法上。于是找到这个方法

 /**     * @abstract     * @private     */    onStoreLoad: Ext.emptyFn,
发现Ext对这个方法的声明是abstract,这个方法是一个空的方法。由此发现Ext的SelectionModel并没有对store重新加载后进行任何的处理。所以我们就自己处理,重写Ext.selection.Model的onStoreLoad方法,在这个方法中更新选中的记录,代码如下

[javascript] view plain copy
  1. /** 
  2.  * 处理Grid重新加载过后selectionModel中的记录不更新的问题 
  3.  * me.selected中存放的是选中的记录的集合 
  4.  */  
  5. Ext.override(Ext.selection.Model,{  
  6.     onStoreLoad:function(store, records, successful, eOpts){  
  7.         var me = this,  
  8.             length = me.selected.getCount( );  
  9.           
  10.         //如果没有选中的记录,则不需要进行任何的操作  
  11.         if(length===0)return;  
  12.           
  13.         //遍历selected并更新其中的记录  
  14.         me.selected.eachKey(function(key,item){  
  15.             var model = store.getById(key);  
  16.               
  17.             //如果获取到了model就更新,否则从selected中移除  
  18.             if(model){  
  19.                 me.selected.add(model);//add时会覆盖掉原来的值  
  20.             }else{  
  21.                 me.selected.removeAtKey(key);  
  22.             }  
  23.         })  
  24.           
  25.     }  
  26. });  


加上上面的代码后问题解决。


阅读全文
0 0
原创粉丝点击