一般来说,组件的对象架构满足了“能运行(Just Works)”这一基本要求。架构在设计上已是调控好了大多数组件是怎样处理的,而且对最终开发者是透明的。 不过,若对组件对象扩展,或是有些需要制定的地方,就要利用一定的时间去实现。 深入理解组件对象的生存周期会是非常好的帮助。下面的内容就是对基于组件的每个类,一个周期内各个重要阶段作出解释:
初始化Initialization
- 配置项对象生效了
The config object is applied.
组件对象的构造器会把全部的配置项传入到其子类中去,并且进行下列所有的步骤。 - 组件的底层事件创建了
The base Component events are created
这些事件由组件对象负责触发。事件有enable, disable, beforeshow, show, beforehide, hide, beforerender, render, beforedestroy, destroy (参阅Component API文档 完整的内容)。 - 组件在组件管理器里登记了
The component is registered in ComponentMgr
initComponent这方法总是使用在子类中,就其本身而论,该方法是一个模板方法(template method),用于每个子类去现实任何所需的构造器逻辑(any needed constructor logic)。首先会创建类,然后组件对象各层次里面的每个类都应该调用superclass.initComponent。通过该方法,就可方便地实现 (implement),或重写(Override)任意一层构造器的逻辑。 - 状态感知进行初始化(如果有的话)
State is initialized (if applicable)
如果组件是状态感知的,其状态会进行刷新。 - 加载好插件(如果有的话)
Plugins are loaded (if applicable)
如果该组件有指定任何插件,这时便会初始化。 - 渲染好插件(如果必须的话)
The component is rendered (if applicable)
如果指定了组件的renderTo 或 applyTo 配置属性,那么渲染工作就会立即开始,否则意味着延时渲染,即等待到显式控制显示,或是其容器告知其显示的命令。
渲染过程 Rendering
- 触发beforerender事件 The beforerender event is fired
这是个可取消的事件,指定的句柄(handler)可阻止组件进行渲染 - 设置好容器 The container is set
如果没有指定一个容器,那么将使用位于DOM元素中组件的父节点作为容器。 - 调用onRender方法 he onRender method is called
这是子类渲染最重要的一个步骤,由于该方法是一个模板方法(template method),用于每个子类去现实任何所需的渲染逻辑(any needed render logic)。首先会创建类,然后组件对象各层次里面的每个类都应调用superclass.onRender。通过该方法,就可方便地实现 (implement),或重写(Override)任意一层渲染的逻辑。 - 组件是“隐藏”状态的 The Component is "unhidden"
默认下,许多组件是由CSS样式类如"x-hidden"设置隐藏的。如果 autoShow 所配置的值为true,这时就不会有这个"hide"样式类作用在该组件上 - 自定义的类、样式生效了 Custom class and/or style applied
一切组件的子类都支持cls 和style 两种特殊的配置属性,分别用于指定用户自定义的CSS样式类和CSS规则。 推荐指定cls的方法来制定组件及其各部分的可视化设置。由于该样式类会套用在组件markup最外的一层元素,所以标准CSS规则会继承到组件下任何子元素的身上。 - 触发render事件 The render event is fired
这是组件通知成功渲染的一个步骤。这时,你可肯定地认为组件的DOM元素是可用的了。如果尝试在渲染之前访问组件,会抛出一个不可用的异常。 - 调用了afterRender方法 The afterRender method is called
这是另外一个实现或重写特定所需的“后渲染”逻辑的模板方法。每个子类应调用superclass.afterRender. - 组件被隐藏或禁用(如果有的话) The Component is hidden and/or disabled (if applicable)
配置项hidden和disabled到这步生效 - 所有状态感知的事件初始化(如果有的话) Any state-specific events are initialized (if applicable)
状态感知的组件可由事件声明特殊加载和保存状态。如支持,加入此类的事件。
销毁过程 Destruction
- 触发beforedesroy事件 The beforedestroy event is fired
这是个可取消的事件,指定的句柄(handler)可阻止组件被销毁。 - 调用了beforeDestroy方法 The beforeDestroy method is called
这是另外一个实现或重写预定销毁逻辑的模板方法。每个子类应调用superclass.beforeDestroy。 - 元素及其侦听器被移除 Element and its listeners are removed
若组件是渲染好的,所属的元素的事件侦听器和DOM树中的元素都会被移除。 - 调用了onDestroy方法 The onDestroy method is called
这是另外一个实现或重写特定所需的“后销毁”逻辑的模板方法。每个子类应调用superclass.onDestroy。注意 容器类(Container class,和一切容器的子类)提供了一个默认的onDestroy实现,自动遍历其items集合里的每一项,分别地执行子组件身上的destroy方法。 - 在组件管理器中撤销组件对象的登记 Component is unregistered from ComponentMgr
使得不能再从Ext.getCmp获取组件对象 - 触发destroy事件 The destroy event is fired
这是组件成功销毁的一个简单通知。此时组件已经DOM中已是不存在的了 - 组件上的事件侦听器被移除 Event listeners on the Component are removed
组件本身可允许从所属的元素得到事件侦听器。如有的话,连同删除。
组件的X类型 XTypes
XTypes 是Ext 2.0中新的概念,被认为是Ext组件的特定类型。可用的xtype摘要可在 Component类API 开始的地方找到。与一般JavaScript对象用法相似,XTypes可用于查找或比较组件对象,如isXType 和getXType 等的方法。其中getXTypes 的方法可列出任意组件的xtpye层次表。
然而,Xtypes最大的用途是怎么用于优化组件的创建和渲染过程。 通过指定一个xtype的配置对象的写法,可隐式声明的方式创建组件,使得当不需要立即渲染的情况就只是一个对象,省去不必要的实例化步骤。这时不仅渲染 的动作是延时的,而且创建实际对象的这一步也是延时的,从而节省了内存和资源。 在复杂的布局中,这种性能上的改进尤为明显。
第一个例子中,面板初始化的同时,按钮总是会立即被创建的。如果加入较多的组件,这种方法很可能减慢的渲染速度。第二例子中,按钮直到面板真正在浏览器上需要显示才会被创建和渲染。
如果面板从未显示(例如有个tab一直是隐藏的),那么按钮就不会被创建,不会消耗任何资源了。
BoxComponent
BoxComponent 是另外一个重要的基类,该类从组件Component扩展,为任何要进行可视渲染和参与布局的组件提供了一致的、跨浏览器的箱子模型(Box Model)实现。BoxComponent负责调节大小和定位,自动处理各浏览器之间的差异,如外/内补丁、边框的问题,形成一个统一的箱子模型,以支 持各种浏览器。2.0的一切容器类(container)继承自BoxComponent。
容器模型Container Model

容器 Container
一个组件如果有包含其它的组件 ,那么,容器Container 便是这个组件奠基之石。该类提供了布局方面和调节大小、嵌套组所需的逻辑,并且提供一个基础性的加入组件协调机制。容器类不应该直接使用,其目的在于为一切可视的容器组件提供一个基类。
面板 Panel
面板Panel 是 2.0最常用的容器,90%布局任务都离不开面板。布局里的排版元素便是面板,面板如同一张白纸,完全是空白的矩形,没有可视内容。虽然这样,面板也提供 了一些预留区域, 方便加入程序所需的UI界面,包括顶部或底部的工具条、菜单栏、头部区域、底部区域和躯干区域。同时内建可展开和可收缩行为的按钮,和其它不同任务预设的 按钮。面板可轻松地下降到任意的容器或布局,当中定位或渲染的逻辑全部由Ext调控,
下列是Ext 2.0面板最主要的几个子类:
Window
Window 是一种可浮动的、可最小/最大化的、可复原的、可拖动的..等此类的特殊面板。其目的在于实现一种具有桌面风格的程序界面的基类,像Ext桌面演示 看到的那样。
视见区Viewport
视见区Viewport 是以document.body作容器的实用类,它会与浏览器视图自适应尺寸,是全屏幕应用的基础,如浏览器大小调节、布局重新计算的问题由该类自动完成。 注意视见区Viewport除了document.body不能渲染在其它的容器上,所以一个页面只能有一个视见区。
布局 Layouts
Ext 2.0 Layout Class Hierarchy