zoukankan      html  css  js  c++  java
  • Ext 修改内容之后 不做任何动作 再次修改时的数据是原来第一次修改前的数据

    转自  http://blog.csdn.net/jaune161/article/details/18220257  

      在项目开发中遇到这样一个问题,点击Grid中的一条记录并修改,修改完后保存并且刷新表格,后台已保存成功,

    并且前台grid中的值也已经改变。这时候被修改的记录还处于选中状态,然后再次点修改,发现表单中的值还是原

    来的值,但是在选择另外一条记录后,再次选择这条记录并修改时发现值已改变。

    经过分析我觉得可能是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手册,,此方法为空

    发现Ext对这个方法的声明是abstract,这个方法是一个空的方法。由此发现Ext的SelectionModel并没有对store

    重新加载后进行任何的处理。所以我们就自己处理,重写Ext.selection.Model的onStoreLoad方法,在这个方法中

    更新选中的记录,代码如下

    /** 
     * 处理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);  
                }  
            })  
              
        }  
    });  

    这段代码重写了   onStoreLoad  方法     ,将这段代码放到你发生这一现象的js中 有效,,放在控制器js中也有效,但是我不知道还有没有更好的地方可以放这个代码

    之前的博主没有说明  重写代码应该放在那个位置,而且网上也很少有说。所以我这提一下。希望对大家有用。另外如果有更好的位置 希望告知!

    转自      http://blog.csdn.net/jaune161/article/details/18220257    详细可以借鉴

  • 相关阅读:
    flash 搜索算法
    小波分析
    Generalised Policy Iteration With Monte-Carlo Evaluation
    Learning an Optimal Policy: Model-free Methods
    To discount or not to discount in reinforcement learning: A case study comparing R learning and Q learning
    adaptive heuristic critic 自适应启发评价 强化学习
    Q-learning
    On Using Very Large Target Vocabulary for Neural Machine Translation Candidate Sampling Sampled Softmax
    Brotli
    数据到达etl系统的时间晚于事务发生的时间
  • 原文地址:https://www.cnblogs.com/caihua0405/p/7941860.html
Copyright © 2011-2022 走看看