您的位置:首页 > 其它

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

2017-10-18 18:46 225 查看
在使用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

/** 

 * 处理Grid重新加载过后selectionModel中的记录不更新的问题 

 * me.selected中存放的是选中的记录的集合 

 */  

Ext.override(Ext.selection.Model,{  

    onStoreLoad:function(store, records, successful, eOpts){  

        var me = this,  

            length = me.selected.getCount( );  

          

        //如果没有选中的记录,则不需要进行任何的操作  

        if(length===0)return;  

          

        //遍历selected并更新其中的记录  

        me.selected.eachKey(function(key,item){  

            var model = store.getById(key);  

              

            //如果获取到了model就更新,否则从selected中移除  

            if(model){  

                me.selected.add(model);//add时会覆盖掉原来的值  

            }else{  

                me.selected.removeAtKey(key);  

            }  

        })  

          

    }  

});  

加上上面的代码后问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ext grid SelectionModel
相关文章推荐