分析AJAX DataSet与DBControl数据感应机制<o:p></o:p>
实现原理<o:p></o:p>
通过注册数据感应对象列表,在DataSet发生相应事件时,通知所有注册的数据感应对象,数据感应对象在得到通知时,根据通知的消息号与数据,进行相关执行比如刷新显示等。
消息号<o:p></o:p>
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
程序分析<o:p></o:p>
以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 } } |
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>