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

分析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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值