论坛首页 Web前端技术论坛

分析AJAX DataSet与DBControl数据感应机制

浏览 2376 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-27  

分析AJAX DataSetDBControl数据感应机制<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设置属性DataSetSetDataSet,将调用LinkObjDBEdit注册到数据感应对象列表,这个列表实际是一个数组,在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);}

       然后看看DBEditHandleMessage做了些什么,见下面实现,无非是刷新显示数据,呵呵,就这么简单。

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>

论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics