`
gkuiyj
  • 浏览: 92172 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
Ext架构分析(2)--理解Ext.util.Observable
  原文链接 http://webtec.blog.ccidnet.com/blog-htm-do-showone-uid-77419-type-blog-itemid-246155.html

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

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


为了方便使用,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方法随时对于事件进行暂停和继续:
suspendEvents : function(){
  this.eventsSuspended = true;
},
resumeEvents : function(){
  this.eventsSuspended = false;
},

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


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


分享到:
评论

相关推荐

    Ext API详解--笔记

    `EXT核心API详解(一) - Ext类.txt`介绍了Ext的基础类,包括`Ext.util.Observable`(观察者模式的实现)、`Ext.app.Application`(管理应用生命周期)等。理解这些类的用法对于构建可维护的应用至关重要。 4. **Ext...

    Extjs4_API文档

    - 示例:`Ext.util.Observable` 存放在 `path/to/src/Ext/util/Observable.js`。 - `Ext.form.action.Submit` 存放在 `path/to/src/Ext/form/action/Submit.js`。 - `MyCompany.chart.axis.Numeric` 存放在 `path...

    Ext Js权威指南(.zip.001

    5.3.2 为组件添加事件接口:ext.util.observable / 188 5.3.3 为组件绑定事件 / 189 5.3.4 内部事件的触发过程 / 192 5.3.5 移除事件 / 194 5.4 特定功能的事件对象 / 196 5.4.1 延时任务:ext.util....

    Extjs4 API文档阅读(一)——类系统(Class System)

    - `Ext.util.Observable` 存放在 `path/to/src/Ext/util/Observable.js` - `Ext.form.action.Submit` 存放在 `path/to/src/Ext/form/action/Submit.js` - `MyCompany.chart.axis.Numeric` 存放在 `path/to/src/My...

    Ext.plugins.TDGi.tabScrollerMenu插件的使用

    通过分析源码,我们可以看到它定义了一个名为`TDGi.tabScrollerMenu`的类,继承自`Ext.util.Observable`,并实现了与Ext JS TabPanel组件的集成。插件的核心方法包括初始化、添加和移除选项卡,以及处理下拉菜单的...

    Ext_类的详细介绍

    通过上述介绍,我们可以看出 **Ext.lib.Event** 和 **Ext.util.Observable** 在 ExtJS 库中分别承担着不同的职责,但都是处理事件的关键部分。理解这两个类的工作原理和使用方法对于高效地使用 ExtJS 开发复杂用户...

    ext事件模型

    通过本文对`ext事件模型`的介绍,我们了解了`Ext.lib.Event`和`Ext.util.Observable`这两个核心组件的功能与用法。掌握了这些知识,开发者就能够更加高效地处理页面中的各种事件,构建出更加强大和复杂的前端应用...

    Ext+JS深入浅出.pdf

    - **Ext.util.Observable**:用于观察对象的变化,是Ext JS中实现事件驱动的核心。 - **Ext.EventManager**:用于管理事件监听器。 - **Ext.EventObject**:封装了事件对象,提供了一系列方法来处理事件。 - **...

    EXT扩展Htmleditor,在工具栏中添加插入图片按钮,可选择图片插入到编辑器中(也可添加其他功能按钮)

    1. 定义插件:首先,你需要创建一个EXT插件类,继承自`Ext.EditorPlugin`或`Ext.util.Observable`,并在构造函数中初始化按钮配置。 ```javascript Ext.ns('MyPlugins'); MyPlugins.ImageInsert = function(config)...

    EXTJS4之类系统和编码规范

    - `Ext.util.Observable` 存储在 `path/to/src/Ext/util/Observable.js`。 - `Ext.form.action.Submit` 存储在 `path/to/src/Ext/form/action/Submit.js`。 - `MyCompany.chart.axis.Numeric` 存储在 `path/to/...

    4.0Ext 类系统

    例如,`Ext.util.Observable` 对应 `path/to/src/Ext/util/Observable.js`。 4. **方法和变量** 方法名和变量名也应遵循驼峰命名法,如 `encodeUsingMd5()` 和 `isGoodName`。 5. **静态属性** 对于常量,尤其是类的...

    EXT 4类的新概念

    - **文件路径**:例如,`Ext.util.Observable`将存储在`path/to/src/Ext/util/Observable.js`中。 ##### 2.3 方法和变量 - **命名规范**:方法名和变量名只能包含字母和数字。同样地,建议遵守驼峰命名法。 - **首...

    handler与listener的区别

    例如,使用`Ext.util.Observable.capture`方法可以捕获并控制事件的传播,但如果`handler`已定义,它可能不会受到`capture`方法的影响。 3. **对比与应用场景** - `handler`是`listener`的一个特殊形式,更适用于...

    Ext中文帮助文档(Ext常见界面源码,及类库方法详解)

    2. Ext.util.Observable:观察者模式实现,用于事件监听和触发。 3. Ext.data.Store:数据存储,与数据源进行交互,支持远程数据加载和本地数据存储。 4. Ext.grid.GridPanel:表格组件的主要类,包含了数据绑定、列...

    EXTJS学习笔记,自己学习的过程,不多但是实用

    - `Ext.util.Observable`类提供事件机制,可以声明并监听自定义事件。如`Person`类声明了`"namechange"`和`"sexchange"`事件,并通过`fireEvent()`方法发布这些事件。 - 使用`on()`方法监听事件,如`_person.on(...

    EXT 登录的设计 extjs4.0

    EXTJS中的 `Ext.util.Observable` 类提供了一套事件系统,允许你在组件间进行通信。 7. **验证(Validation)**:EXTJS 4.0 提供了强大的表单验证功能,可以通过 `Ext.form.field.VTypes` 或自定义验证函数确保用户...

    Ext开发总结

    4. `Ext.util.Observable` `Observable`类是Ext事件模型的基础,它提供了一种方式来监听和响应对象上的事件。任何Ext组件都继承自`Observable`,可以通过`on`、`un`等方法来管理事件。`Observable`还支持事件拦截器...

    Ext 3.0 中文API CHM

    10. **事件系统**:Ext.util.Observable是所有可观察对象的基类,提供了事件监听和触发机制,是实现组件间通信的关键。 11. **国际化支持**:Ext 3.0 提供了本地化支持,允许开发者轻松地将应用翻译成不同语言。 ...

    深入浅出ExtJS第2版

    2.1.4 Ext.util.Observable 14 2.1.5 Ext.EventManager 17 2.1.6 Ext.EventObject 19 2.2 EXT的核心组件 20 2.2.1 Ext.Component 20 2.2.2 Ext.BoxComponent 22 2.2.3 Ext.Container 23 2.2.4 Ext.Panel 24 ...

Global site tag (gtag.js) - Google Analytics