分析AJAX WebShop DataSet與DBControl資料感應機制
實現原理 通過註冊資料感應對象列表,在DataSet發生相應事件時,通知所有註冊的資料感應對象,資料感應對象在得到通知時,根據通知的訊息編號與資料,進行相關執行比如重新整理顯示等。訊息編號modify:12open:0refresh:5close:7move record:3append:1delete:2firedatachange:6post:13cancel:9apply:8fieldvalue firechange:4notify lookup dataset:11程式分析 以DBEdit為例,首先DBEdit設定屬性DataSet或SetDataSet,將調用LinkObj將DBEdit註冊到資料感應對象列表,這個列表實際是一個數組,在DataSet發生相關事件時,將調用Notify通知數據感應對象列表中的所有對象,而所有的資料感應對象都有一個介面實現HandleMessage,用於在DataSet中調用,看一下Notify的實現就清楚了:
DataSet.prototype.Notify=function(act,recno,p){var os=this.linkobjs;if(!os||this.AutoControl==false)return;for(var j=0;j<os.length;j++)if(os[j].HandleMessage)os[j].HandleMessage(this,act,recno,p);} |
然後看看DBEdit的HandleMessage做了些什麼,見下面實現,無非是重新整理顯示資料,呵呵,就這麼簡單。
function DC_handlemessage(sender,msg,recno){ if(msg!=6&&msg!=12) this.Refresh();}function DC_refresh(){ var v,f; if(this.DataSet.Active){ f=this.DataSet.Fields.Field[this.DataField]; if(!f)jcl_err(this.Name+'.DataField:'+this.DataField+Err_NoField); if(f){ this.readOnly=f.ReadOnly; v=f.GetValue(); if(v==null)v='';this.value=v; if(this.Type=='span')this.innerHTML=v;//DBLabel if(this.Type=='checkbox'){if(this.CheckedValue == v){ this.checked=true; this.defaultChecked=true; }else{ this.checked=false; } } } } else{ this.value=''; if(this.Type=='span')this.innerHTML='';//DBLabel }} |