Ext 详解--查看文章
 
Ext源码分析之模板模式解说——Ext组件渲染render的全过程详述
发布时间:2008-11-30

模板模式是设计模式中很重要的一个知识点,我在模式总结——模板方法这篇文章中已有总结,在面向对象设计中有着举足轻重的地位。

在Ext中更是发挥的淋漓尽致,为什么这么说呢?Ext中的组件有着很深的继承关系,很多方法都有着重复,而且不仅
是代码上的重复,更多的是流程上的重复

比方说,Ext.Panel吧,将一个Panel显示在浏览器中,其过程叫做render(渲染)。有这么几道工序:
第一、触发”beforeRender”事件
第二、得到这个Panel的父节点(针对DOM来说),即容器,也就是供Panel入住的那个容器
第三、设置rendered=true
第四、调用onRender方法,这步是最重要的,也就是如何将组件显示在浏览器上,涉及到很多流程,一会详解
第五、设置这个panel的css
第六、触发”render”事件,指的是当render完成后,触发的事件
第七、调用aferRender,这步和第四步一样,是很重要的流程之一
第八、看看要不要将这个panel隐藏或者失效,如果用户设置了hidden或者disable
第九、设置这个panel的位置,也就是doLayout,布局

再来,Ext.Panel的子类,Ext.TabPanel,也有这么几道工序:
第一、触发”beforeRender”事件
第二、得到这个Panel的父节点(针对DOM来说),即容器,也就是供Panel入住的那个容器
第三、设置rendered=true
第四、调用onRender方法,这步是最重要的,也就是如何将组件显示在浏览器上,涉及到很多流程,一会详解
第五、设置这个panel的css
第六、触发”render”事件,指的是当render完成后,触发的事件
第七、调用aferRender,这步和第四步一样,是很重要的流程之一
第八、看看要不要将这个panel隐藏或者失效,如果用户设置了hidden或者disable
第九、设置这个panel的位置,也就是doLayout,布局
第十、设置activeTab,也就是激活哪个Tab面板

仅仅多了第十个步骤。

其他例子不举了,都是仅仅在最后几个步骤上不同而已,大家要说了,这个那是什么模板模式,不就是最简单的继承吗?
错了,继承指的是属性和方法的继承,但现在是一个流程,一个系列的工序”继承”,这就是模板模式了。

我们来看,应用了模板模式后的工序

Ext.TabPanel只有2道工序了
第一、完成Panel渲染的工序
第二、设置activeTab,也就是激活哪个Tab面板

Ext.Panel一道工序
第一、完成Ext.Container的渲染工序

Ext.Container有2道工序
第一、完成BoxComponent的渲染工序
第二、设置这个panel的位置,也就是doLayout,布局

Ext.BoxComponent一道工序
第一、完成Ext.Component的渲染工序

Ext.Component八道工序
第一、触发”beforeRender”事件
第二、得到这个Panel的父节点(针对DOM来说),即容器,也就是供Panel入住的那个容器
第三、设置rendered=true
第四、调用onRender方法,这步是最重要的,也就是如何将组件显示在浏览器上,涉及到很多流程,一会详解
第五、设置这个panel的css
第六、触发”render”事件,指的是当render完成后,触发的事件
第七、调用aferRender,这步和第四步一样,是很重要的流程之一
第八、看看要不要将这个panel隐藏或者失效,如果用户设置了hidden或者disable

下面把流程图展示出来(配合上onRender和afterRender)

我们来看下图

那么在Ext是如何让这些流程在不同类之间自由跳转的呢?这就是大名鼎鼎的call和apply在起着重要作用了
比如我们来看如下代码
Ext.Panel.superclass.onRender.call(this, ct, position);
什么意思?this就是panel的意思,Ext.Panel.superclass就是Ext.Container,这句代码的意思就是“panel,你给我去执行container里面的onRender方法”
那么在Ext.Container的onRender方法有存在着
Ext.Container.superclass.onRender.call(this, ct, position);
这样的代码,这里的this还是指panel,不懂看上图,这里所有的this统统指panel对象,记住!意思是“panel,你再给我执行container父类里面的onRender方法”
接着又会出现“panel,你再给我执行container父类的父类里面的onRender方法”,一层层递归下去了,呵呵

仔细的朋友去看container的时候会发现没有onRender方法,不错,代码里确实没有,但是执行起来之后就有了,不懂?看我的
Ext源码分析源码分析之Ext的继承模式解说



 [Ext 详解]Ext源码解析:3, DomHelper.js (未知,08-17)
Ext的DomHelper主要是定义了一些操作Dom元素的Helper方法:1234567insertBeforeinsertAfterinsertFirstappendoverwriteinsertHtmlapplyStylesExt支持纯HTML或者数组或一个JavaScript对象来描述用来添……

 [Ext 详解]ExtJS中的面向对象设计,组件化编程思想 (myext整理,04-05)
/*  2 * @author: Lilf  3 * Description: ExtJS中的面向对象设计,组件化变成思想  4 */  5/**//……

 [Ext 详解]ext js tree grid 通信 (myext整理,07-10)
buildUnitTree=function(){        //定义根节点的Loader   //   var treeloader=new Tree.T……

 [Ext 详解]extJs 2.0学习笔记(Ajax篇) (佚名,07-21)
一听到Ajax,我与大家一样,如雷贯耳,都说XXX Ajax框架,事实上,这一部分内容在ExtJs中是基础中的基础,就那个样。这儿主要是讨论一些资料、书本都不会涉及的领域。这些东西平常只能由自己摸索的。   在此话题之先,先解决一个问题,现在用asp.net的人多了,但是,用asp.net ajax……

 [Ext 详解]标准布局类:1.ContainerLayout容器布局 (myext整理,06-21)
    面板相当于一张干净的白纸,如果直接在上面添加内容,将很难控制面板中内容的显示位置,面板元素越多就越显得凌乱,所以需要在面板上划分不同的区域,将面板内容展示到希望的位置上。ExtJS通过提供多种布局类来为面板提供支持,主要包括如下10种:  &……

 


©2008 MyExt.cn
本站文章来自互联网,仅供学习和研究使用,如有版权问题,请发送Email:myext@126.com.