分析AJAX WebShop DataSet與DBControl數據感應機制

分析AJAX WebShop DataSet與DBControl數據感應機制
實現原理
       通過註冊數據感應對象列表,在DataSet發生相應事件時,通知所有註冊的數據感應對象,數據感應對象在得到通知時,根據通知的消息號與數據,進行相關執行比如刷新顯示等。
消息號
modify:12
open:0
refresh:5
close:7
move record:3
append:1
delete:2
firedatachange:6
post:13
cancel:9
apply:8
fieldvalue firechange:4
notify 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
 }
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章