Ext架构分析(2)--理解Ext.util.Observable

本文深入介绍了Observable模式在软件开发中的应用,重点讲解了其提供的事件封装机制,包括addListener、removeListener等方法的具体实现,以及如何使用addEvents方法绑定多个Event对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Observable维护了一个events数组,并提供了更加方便的对于事件的封装和调用机制。同Event一样,它也提供了addListener、removeListener方法。它提供的addListenere方法使用起来更加方便,你可以通过json对象一次实现多个事件的绑定:
ExpandedBlockStart.gifContractedBlock.giffoo.addListener(dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
'click' : dot.gif
InBlock.gif  fn: 
this.onClick, 
InBlock.gif  scope: 
this
InBlock.gif  delay: 
100 
ExpandedSubBlockEnd.gif}

ExpandedSubBlockStart.gifContractedSubBlock.gif
'mouseover' : dot.gif
InBlock.gif  fn: 
this.onMouseOver, 
InBlock.gif  scope: 
this 
ExpandedSubBlockEnd.gif}

ExpandedSubBlockStart.gifContractedSubBlock.gif
'mouseout' : dot.gif
InBlock.gif  fn: 
this.onMouseOut, 
InBlock.gif  scope: 
this 
ExpandedSubBlockEnd.gif}
 
ExpandedBlockEnd.gif}

None.gif

如果你看一下源程序,你会发现,实际上,observable最终还是把事件绑定机制委托到Event对象上:
ExpandedBlockStart.gifContractedBlock.gifaddListener : function(eventName, fn, scope, o)dot.gif
InBlock.gif    
//如果参数是一个json对象 
ExpandedSubBlockStart.gifContractedSubBlock.gif
    if(typeof eventName == "object")dot.gif
InBlock.gif    o 
= eventName; 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for(var e in o)dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
if(this.filterOptRe.test(e))dot.gif
InBlock.gif        
continue
ExpandedSubBlockEnd.gif      }
 
ExpandedSubBlockStart.gifContractedSubBlock.gif      
if(typeof o[e] == "function")dot.gif
InBlock.gif        
// shared options 
InBlock.gif
        this.addListener(e, o[e], o.scope, o); 
ExpandedSubBlockStart.gifContractedSubBlock.gif      }
elsedot.gif
InBlock.gif        
// individual options 
InBlock.gif
        this.addListener(e, o[e].fn, o[e].scope, o[e]); 
ExpandedSubBlockEnd.gif      }
 
ExpandedSubBlockEnd.gif    }
 
InBlock.gif    
return
ExpandedSubBlockEnd.gif  }
 
ExpandedSubBlockStart.gifContractedSubBlock.gif  o 
= (!|| typeof o == "boolean"? dot.gif{} : o; 
InBlock.gif  eventName 
= eventName.toLowerCase(); 
InBlock.gif  
var ce = this.events[eventName] || true
ExpandedSubBlockStart.gifContractedSubBlock.gif  
if(typeof ce == "boolean")dot.gif
InBlock.gif    
//事件不存在则新建一个Event对象并把它纳入event数组 
InBlock.gif
    ce = new Ext.util.Event(this, eventName); 
InBlock.gif    
this.events[eventName] = ce; 
ExpandedSubBlockEnd.gif  }
 
InBlock.gif  
//调用event的addListener方法 
InBlock.gif
  ce.addListener(fn, scope, o); 
ExpandedBlockEnd.gif}
 
None.gif
除了支持addListener方法,Obserable还提供了一个addEvent方法,通过该方法,Observable可以绑定多个不包含处理句柄的Event对象:
 
ExpandedBlockStart.gifContractedBlock.gifaddEvents : function(o)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(!this.events)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
this.events = dot.gif{};
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(typeof o == 'string')dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for(var i = 0, a = arguments, v; v = a; i++)dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif          
if(!this.events[a])dot.gif{
InBlock.gif            o[a] 
= true;
ExpandedSubBlockEnd.gif          }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif    }
elsedot.gif{
InBlock.gif        Ext.applyIf(
this.events, o);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif  }
,
None.gif


为了方便使用,observable对addListener和removeListener提供了一个更加简洁的所写:on和un:
Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;
Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;

你可以通过suspendEvents和resumeEvents方法随时对于事件进行暂停和继续:
ExpandedBlockStart.gifContractedBlock.gifsuspendEvents : function()dot.gif
InBlock.gif  
this.eventsSuspended = true
ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gifresumeEvents : 
function()dot.gif
InBlock.gif  
this.eventsSuspended = false
ExpandedBlockEnd.gif}

None.gif

当然,通过fireEvent方法,你可以触发制定的事件:
ExpandedBlockStart.gifContractedBlock.giffireEvent : function()dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif  
if(this.eventsSuspended !== true)dot.gif
InBlock.gif    
//arguments[0]就是你需要触发的事件 
InBlock.gif
    var ce = this.events[arguments[0].toLowerCase()]; 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(typeof ce == "object")dot.gif
InBlock.gif      
return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); 
ExpandedSubBlockEnd.gif    }
 
ExpandedSubBlockEnd.gif  }
 
InBlock.gif  
return true
ExpandedBlockEnd.gif}

None.gif


Observable还通过capture和releaseCapture提供了对于事件处理函数的拦截机制:
ExpandedBlockStart.gifContractedBlock.gifExt.util.Observable.capture = function(o, fn, scope)dot.gif
InBlock.gifo.fireEvent 
= o.fireEvent.createInterceptor(fn, scope); 
ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gifExt.util.Observable.releaseCapture 
= function(o)dot.gif
InBlock.gifo.fireEvent 
= Ext.util.Observable.prototype.fireEvent; 
ExpandedBlockEnd.gif}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值