以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 HTML/XHTML/Ajax/Web 2.0/Web 3.0 』  (http://bbs.xml.org.cn/list.asp?boardid=22)
----  分析AJAX DataSet与DBControl数据感应机制[转帖]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=22&rootid=&id=42094)


--  作者:todayopen
--  发布时间:1/8/2007 12:07:00 PM

--  分析AJAX DataSet与DBControl数据感应机制[转帖]
分析AJAX 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
  }
}



--  作者:dabo
--  发布时间:4/11/2007 12:37:00 PM

--  
如果没有用过ajax webshop,肯定看不懂你在说什么。。。。


lz做人要厚道。。。。,你应该先讲这个市干什么的阿


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms