最近在看項目源碼的時候發現了如下代碼,其中_searchSupplierStore是JsonStore對象
_searchSupplierStore.on('beforeload',function(thiz,options){
thiz.baseParams["cusCode"]="%"+Ext.getCmp('id_cusCodetext').getValue()+"%";
thiz.baseParams["cusType"]=Ext.getCmp('id_cusTypetext').getValue();
thiz.baseParams["addr"]= "%"+Ext.getCmp('id_addrtext').getValue()+"%"
});
看到這裡,其中的function(thiz,options)百思不得其解,thiz,和options是什麼呢,各種search項目代碼,發現只有如此寫法,沒有相關說明。
經過查詢以及與別人探討,最後終於明白這玩意是什麼東西了。
JsonStore的on函數裡面有監聽器函數handler,具體寫handler的時候要根據store所觸發的事件去實現。比如beforeload事件,store的beforeload事件傳遞兩個參數,所以handler的實現裡面也會有兩個參數,而handler的實現函數裡面的參數是形參,所以名字隨便取,並且因為JavaScript是弱類型語言在聲明變數時 不需要註明變數類型,所以形參會出現只有亂七八糟的標誌符的樣子(例如function(thiz,options)),不像編譯語言的函數參數還要宣告類型。
on( String eventName, Function handler, [Object scope], [Object options] )
beforeload : ( Store this, Object options )
this : Store
options : Object
The loading options that were specified (see load for details)這裡面有個連結,發現就是store的config options
總結一下,也許總的原因還是自己沒有從事件發生與處理機制去思考,去尋找吧。一般都是事件回呼函數綁定在某個對象上(即監聽器裡面的回呼函數),該對象的具體事件發生事,會調用回回呼函數,同時也回把事件發生事的一些“現場”(以參數形式)傳遞給回呼函數。在extjs中這個發生事件的現場要去對象的事件函數裡面查詢,這樣才能在具體回呼函數中寫正確對應形參。
java awt中的事件機制是傳遞一個ActionEvent對象將現場傳遞。
總結是一種態度,更是一種進步