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

简介: Observable维护了一个events数组,并提供了更加方便的对于事件的封装和调用机制。同Event一样,它也提供了addListener、removeListener方法。它提供的addListenere方法使用起来更加方便,你可以通过json对象一次实现多个事件的绑定: foo.
Observable维护了一个events数组,并提供了更加方便的对于事件的封装和调用机制。同Event一样,它也提供了addListener、removeListener方法。它提供的addListenere方法使用起来更加方便,你可以通过json对象一次实现多个事件的绑定:
img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif foo.addListener( img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
'click' : img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  fn: 
this.onClick, 
img_33d02437d135341f0800e3d415312ae8.gif  scope: 
this
img_33d02437d135341f0800e3d415312ae8.gif  delay: 
100 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
'mouseover' : img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  fn: 
this.onMouseOver, 
img_33d02437d135341f0800e3d415312ae8.gif  scope: 
this 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
'mouseout' : img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  fn: 
this.onMouseOut, 
img_33d02437d135341f0800e3d415312ae8.gif  scope: 
this 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif

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

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
if(typeof o == 'string')img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
for(var i = 0, a = arguments, v; v = a; i++)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif          
if(!this.events[a])img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif            o[a] 
= true;
img_105a1e124122b2abcee4ea8e9f5108f3.gif          }

img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    }
elseimg_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif        Ext.applyIf(
this.events, o);
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_05dd8d549cff04457a6366b0a7c9352a.gif  }
,
img_a6339ee3e57d1d52bc7d02b338e15a60.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方法随时对于事件进行暂停和继续:
img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif suspendEvents :  function () img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.eventsSuspended = true
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gifresumeEvents : 
function () img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.eventsSuspended = false
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif

当然,通过fireEvent方法,你可以触发制定的事件:
img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif fireEvent :  function () img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
if(this.eventsSuspended !== true)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif    
//arguments[0]就是你需要触发的事件 
img_33d02437d135341f0800e3d415312ae8.gif
    var ce = this.events[arguments[0].toLowerCase()]; 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
if(typeof ce == "object")img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif      
return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }
 
img_105a1e124122b2abcee4ea8e9f5108f3.gif  }
 
img_33d02437d135341f0800e3d415312ae8.gif  
return true
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif


Observable还通过capture和releaseCapture提供了对于事件处理函数的拦截机制:
img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif Ext.util.Observable.capture  =   function (o, fn, scope) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gifo.fireEvent 
= o.fireEvent.createInterceptor(fn, scope); 
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gifExt.util.Observable.releaseCapture 
=   function (o) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gifo.fireEvent 
= Ext.util.Observable.prototype.fireEvent; 
img_05dd8d549cff04457a6366b0a7c9352a.gif}

目录
相关文章
|
3月前
|
缓存 网络协议 数据库连接
C/S架构中HTTP错误状态码原因分析及解决办法
HTTP(Hypertext Transfer Protocol)是用于在客户端和服务器之间传输数据的协议。当在浏览器或其他HTTP客户端中访问网页时,可能会发生各种访问报错。我们需要根据网页提供的错误状态码分析错误原因,以找到相对应的解决办法。
42 0
|
4月前
|
设计模式 前端开发 Java
KnowStreaming系列教程第二篇——项目整体架构分析
KnowStreaming系列教程第二篇——项目整体架构分析
42 0
|
4月前
|
人工智能 缓存 并行计算
技术改变AI发展:Ada Lovelace架构解读及RTX 4090性能测试分析(系列三)
简介:随着人工智能(AI)的迅速发展,越来越多的应用需要巨大的GPU计算资源。Ada lovelace(后面简称Ada)是NVIDIA最新的图形处理器架构,随2022年9月20日发布的RTX 4090一起公布。
135410 10
技术改变AI发展:Ada Lovelace架构解读及RTX 4090性能测试分析(系列三)
|
4月前
|
SQL 开发框架 安全
Linux系统中ARMv8架构u-boot启动流程分析
Linux系统中ARMv8架构u-boot启动流程分析
131 1
|
4月前
|
边缘计算 编译器 数据中心
X86架构与Arm架构的主要区别分析
X86架构与Arm架构的主要区别分析
470 0
|
28天前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
32 0
|
28天前
|
存储 Java 应用服务中间件
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
51 0
|
1月前
|
监控 JavaScript 安全
监控内网电脑软件设计与实现:基于Node.js的服务器端架构分析
在当今信息技术高度发达的时代,监控内网电脑的需求日益增长。企业需要确保网络安全,个人用户也需要监控家庭网络以保护隐私和安全。本文将介绍一种基于Node.js的服务器端架构,用于设计和实现监控内网电脑软件。
103 0
|
1月前
|
Web App开发 JavaScript 前端开发
分析网站架构:浏览器插件
分析网站架构:浏览器插件
44 1