1. 程式人生 > >處理ExtJs記錄修改並重新整理後,再次點修改記錄不變的問題

處理ExtJs記錄修改並重新整理後,再次點修改記錄不變的問題

在專案開發中遇到這樣一個問題,點選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方法,在這個方法中更新選中的記錄,程式碼如下
/**
 * 處理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);
			}
		})
		
	}
});


加上上面的程式碼後問題解決。