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,方法内容如下。
发现监听了store的load事件,于是猜想问题应该出在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);
}
})
}
});
加上上面的代码后问题解决。
第一种:
更新数据后对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);
}
})
}
});
加上上面的代码后问题解决。
相关文章推荐
- f12只显示当前的静态页面,如果再执行任何前台操作(不与服务器进行交互),静态页面的代码是不会发生任何改变的
- [Extjs6] Ext.data.Store Gridpanel默认选中一些记录
- jdbc插入一条记录后,马上获取到当前记录的id,以方便对插入的当前记录进行更多的操作
- Coolite GridPanel 操作之一:获取gridpanel 选中行的记录信息
- js实现对选中的多条记录进行删除操作
- oracle实现 无则insert插入,有则update更新,一条语句直接进行insert/update操作
- 关于ext中使用 Ext.grid.CheckboxSelectionModel作为选择框如何保存选中记录的解决方法。
- 如果结合GridView和DetailsView对数据进行操作,那么当数据库的记录为空的时候,怎么来增加新记录呢?
- ext grid 删除最后一条数据后,页面更新失败
- js实现对选中的多条记录进行删除操作
- Coolite GridPanel 操作之一:获取gridpanel 选中行的记录信息
- Ext对Grid多项选择进行多个选择操作
- Ext, GridPanel加载完数据后进行操作
- 【解决方案】Ext.grid.CheckboxSelectionModel 实现锁住指定行不被选中
- 在Ext.grid.GridPanel中每次都显示最后一条记录
- mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入
- 进行异常捕获,查询lastname为smith的员工信息,如果该员工不存在,则插入一条新记录;如果存在多个同名的员工,则输出其员工号,姓名和工资
- oracle case when,如果有多个,如果一条记录满足第一个case when就不会再去执行后面的case when
- 如果同一条记录同时多个进程可能对不同的字段进行修改,怎么保证列锁?
- mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入