EXT 第三天(組建模型)

组件模型 Component Model

组件概述

2.0的一个目标就是希望能以简单的代码块构建程序,甚至比以往更简单。 组件Component类最初在1.x引入,却没有全面整合到框架中去。在2.0中,组件所赋予的能力有长足的改进和提升,使得其成为整个架构里最为基础的一个类。 组件对象为组件的创建、渲染、事件处理、状态管理和销毁提供了统一的模型,Ext下面的每一个组件具备了这些由组件对象扩展出来的特性。这是2.0组件对象的关键特性:

  • 显式声明构建器链和重写 Explicit constructor chaining and overriding
    组件会将一个基础构造器连同配置传入到子类中。函数initComponent用于提供制定的构造器逻辑,只要在继承链上的某一个子类实现便可,所有的组件都遵从此方式。此时的子类就可在initComponent中对其设置相关的属性,实现具体的功能。
  • 可调控的渲染 Managed rendering
    2.0中,每个组件都支持延时渲染(lazy rendering),又称按需渲染(on-demand rendering)。渲染的调控一般是为你自动设置完好的。即使如此,你亦可以通过的beforerenderrender事件控制渲染发生、结束,达到最为灵活的自定义调控。
  • 可调控的销毁 Managed destruction
    每一个组件具有destroy的函数,当组件不再需要时,Ext就负责组件的结束调控,如自动垃圾回收和摧毁组件元素。当然,销毁亦提供相应的事件,如beforedestroydestroy可按照实际的情况作出逻辑处理。
  • 状态管理自动化 Automatic state management
    组件内建设置和获取状态(State)的功能,只要让全局对象StateManager和一个状态 Provider都初始化好,那么多数的组件都具有自动状态管理的能力。
  • 组件常规行为的统一接口 Consistent interface for basic component behavior 
    一般常规的行为如隐藏、显示和激活、禁用均是组件的基本特性。如需要,这些都可由子类去重写或制定。
  • 由组件管理器负责的可用调配 Availability via ComponentMgr
    Ext的每一个组件在创建的时候就会由组件管理器登记注册,即你可随时获取任何组件,只需调用Ext.getCmp('id')
  • 支持插件 Plugin support
    现在任何的组件可以通过插件的形式来扩展了。 插件实质是带有init方法的一种类。该方法会有一个单独的参数(类型为Ext.Component)传入到其中。 插件可通过组件的plugins配置项指定。当组件创建时,如果有插件可用,组件就会调用每个插件上的init方法,将自身的引用作为参数传入。 每个插件运行之后可调用组件的方法或响应组件的事件以实现自身的功能。
组件的生存周期Component Life Cycle

一般来说,组件的对象架构满足了“能运行(Just Works)”这一基本要求。架构在设计上已是调控好了大多数组件是怎样处理的,而且对最终开发者是透明的。 不过,若对组件对象扩展,或是有些需要制定的地方,就要利用一定的时间去实现。 深入理解组件对象的生存周期会是非常好的帮助。下面的内容就是对基于组件的每个类,一个周期内各个重要阶段作出解释:

初始化INITIALIZATION
  1. 配置项对象生效了 
    The config object is applied.
    组件对象的构造器会把全部的配置项传入到其子类中去,并且进行下列所有的步骤。
  2. 组件的底层事件创建了
    The base Component events are created

    这些事件由组件对象负责触发。事件有enable, disable, beforeshow, show, beforehide, hide, beforerender, render, beforedestroy, destroy (参阅Component API文档完整的内容)。
  3. 组件在组件管理器里登记了
    The component is registered in ComponentMgr

    initComponent这方法总是使用在子类中,就其本身而论,该方法是一个模板方法(template method),用于每个子类去现实任何所需的构造器逻辑(any needed constructor logic)。首先会创建类,然后组件对象各层次里面的每个类都应该调用superclass.initComponent。通过该方法,就可方便地实现(implement),或重写(Override)任意一层构造器的逻辑。
  4. 状态感知进行初始化(如果有的话)
    State is initialized (if applicable)

    如果组件是状态感知的,其状态会进行刷新。
  5. 加载好插件(如果有的话)
    Plugins are loaded (if applicable)

    如果该组件有指定任何插件,这时便会初始化。
  6. 渲染好插件(如果必须的话)
    The component is rendered (if applicable)

    如果指定了组件的renderTo 或 applyTo配置属性,那么渲染工作就会立即开始,否则意味着延时渲染,即等待到显式控制显示,或是其容器告知其显示的命令。
渲染过程 RENDERING
  1. 触发beforerender事件 The beforerender event is fired
    这是个可取消的事件,指定的句柄(handler)可阻止组件进行渲染
  2. 设置好容器 The container is set
    如果没有指定一个容器,那么将使用位于DOM元素中组件的父节点作为容器。
  3. 调用onRender方法 The onRender method is called
    这是子类渲染最重要的一个步骤,由于该方法是一个模板方法(template method),用于每个子类去现实任何所需的渲染逻辑(any needed render logic)。首先会创建类,然后组件对象各层次里面的每个类都应调用superclass.onRender。通过该方法,就可方便地实现(implement),或重写(Override)任意一层渲染的逻辑。
  4. 组件是“隐藏”状态的 The Component is "unhidden"
    默认下,许多组件是由CSS样式类如"x-hidden"设置隐藏的。如果 autoShow所配置的值为true,这时就不会有这个"hide"样式类作用在该组件上
  5. 自定义的类、样式生效了 Custom class and/or style applied
    一切组件的子类都支持clsstyle 两种特殊的配置属性,分别用于指定用户自定义的CSS样式类和CSS规则。 推荐指定cls的方法来制定组件及其各部分的可视化设置。由于该样式类会套用在组件markup最外的一层元素,所以标准CSS规则会继承到组件下任何子元素的身上。
  6. 触发render事件 The render event is fired
    这是组件通知成功渲染的一个步骤。这时,你可肯定地认为组件的DOM元素是可用的了。如果尝试在渲染之前访问组件,会抛出一个不可用的异常。
  7. 调用了afterRender方法 The afterRender method is called
    这是另外一个实现或重写特定所需的“后渲染”逻辑的模板方法。每个子类应调用superclass.afterRender.
  8. 组件被隐藏或禁用(如果有的话) The Component is hidden and/or disabled (if applicable)
    配置项hidden和disabled到这步生效
  9. 所有状态感知的事件初始化(如果有的话) Any state-specific events are initialized (if applicable)
    状态感知的组件可由事件声明特殊加载和保存状态。如支持,加入此类的事件。
销毁过程 DESTRUCTION
  1. 触发beforedesroy事件 The beforedestroy event is fired
    这是个可取消的事件,指定的句柄(handler)可阻止组件被销毁。
  2. 调用了beforeDestroy方法 The beforeDestroy method is called
    这是另外一个实现或重写预定销毁逻辑的模板方法。每个子类应调用superclass.beforeDestroy
  3. 元素及其侦听器被移除 Element and its listeners are removed
    若组件是渲染好的,所属的元素的事件侦听器和DOM树中的元素都会被移除。
  4. 调用了onDestroy方法 The onDestroy method is called
    这是另外一个实现或重写特定所需的“后销毁”逻辑的模板方法。每个子类应调用superclass.onDestroy注意 容器类(Container class,和一切容器的子类)提供了一个默认的onDestroy实现,自动遍历其items集合里的每一项,分别地执行子组件身上的destroy方法。
  5. 在组件管理器中撤销组件对象的登记 Component is unregistered from ComponentMgr
    使得不能再从Ext.getCmp获取组件对象
  6. 触发destroy事件 The destroy event is fired
    这是组件成功销毁的一个简单通知。此时组件已经DOM中已是不存在的了
  7. 组件上的事件侦听器被移除 Event listeners on the Component are removed
    组件本身可允许从所属的元素得到事件侦听器。如有的话,连同删除。
组件的X类型 XTypes

XTypes是Ext 2.0中新的概念,被认为是Ext组件的特定类型。可用的xtype摘要可在 Component类API开始的地方找到。与一般JavaScript对象用法相似,XTypes可用于查找或比较组件对象,如isXTypegetXType等的方法。 其中getXTypes的方法可列出任意组件的xtpye层次表。

然而,Xtypes最大的用途是怎么用于优化组件的创建和渲染过程。 通过指定一个xtype的配置对象的写法,可隐式声明的方式创建组件,使得当不需要立即渲染的情况就只是一个对象,省去不必要的实例化步骤。这时不仅渲染的动作是延时的,而且创建实际对象的这一步也是延时的,从而节省了内存和资源。 在复杂的布局中,这种性能上的改进尤为明显。

//显式创建所容纳的组件
var panel = new Ext.Panel({
   ...
   items: [
      new Ext.Button({
         text: 'OK'
      })
   ]
};
 
//使用xtype创建
var panel = new Ext.Panel({
   ...
   items: [{
      xtype: 'button',
      text: 'OK'
   }]
};

第一个例子中,面板初始化的同时,按钮总是会立即被创建的。 如果加入较多的组件,这种方法很可能减慢的渲染速度。 第二例子中,按钮直到面板真正在浏览器上需要显示才会被创建和渲染。

如果面板从未显示(例如有个tab一直是隐藏的),那么按钮就不会被创建,不会消耗任何资源了。

BoxComponent

BoxComponent 是另外一个重要的基类,该类从组件Component扩展,为任何要进行可视渲染和参与布局的组件提供了一致的、跨浏览器的箱子模型(Box Model)实现。BoxComponent负责调节大小和定位,自动处理各浏览器之间的差异,如外/内补丁、边框的问题,形成一个统一的箱子模型,以支持各种浏览器。2.0的一切容器类(container)继承自BoxComponent。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值