• 处理Extjs的gridpanel修改一条记录并重新加载store之后,已选项model的record并没有改变的问题


    昨天做项目发现一个问题,当修改了grid中的一条选中记录,保存并刷新store之后再次点开或者读取该选中行record发现还是修改之前的值,但是当鼠标选中其它行并再次回到刚刚修改的记录之后,点开或者读取record发现是修改后的数据,后台数据在修改保存后已刷新,界面显示也是最新数据,但是该条record在不更改已选项的情况下依然是之前的数据,在网上找到了一个解决办法并学习下别人的思路。

    文章地址:http://blog.csdn.net/jaune161/article/details/18220257  转载请注明出处!

    在项目开发中遇到这样一个问题,点击Grid中的一条记录并修改,修改完后保存并且刷新表格,后台已保存成功,并且前台grid中的值也已经改变。这时候被修改的记录还处于选中状态,然后再次点修改,发现表单中的值还是原来的值,但是在选择另外一条记录后,再次选择这条记录并修改时发现值已改变。

    如图:这是原记录,现在我们在角色说明后面加几个*号,测试

    保存后,原来被修改的记录还处于选择状态,然后我点击修改按钮,发现Form中的值还是修改前的值。

    注:表单是通过loadRecord的方式加载的值,在每次赋值前都执行了reset(true)方法,所以不是Form缓存的问题

    当我们选择另外一条记录,然后再此选择这条记录是值又变成了修改后的值

    经过分析我觉得可能是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 plaincopy在CODE上查看代码片派生到我的代码片
     
    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. });  



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

  • 相关阅读:
    [BTS2004]一步一步学习BizTalk2004 Sql Server Adapter
    [JWT]安装配置AdobeWorkFlowServer
    [BizTalk][MSMQAdapter]如何使用MSMQ的优先级设置呢?
    [JWS]Adobe WorkFlow 学习笔记(二)
    [RS]消息订阅应用实例(一)
    [BizTalk][Pipeline]使用Pipeline(一)
    ActiveDirectoryLib
    [ASP.NET]10 Tips for Writing HighPerformance Web Applications
    [UML]始
    [学习笔记][C++Primer Plus]String类的使用
  • 原文地址:https://www.cnblogs.com/linruiyi2015/p/4916580.html
Copyright © 2020-2023  润新知