Ext2.0布局类初探

系统 1884 0

Ext2.0 正式版虽然还没出来,但是官网上的例程还是令人兴奋不已。内存泄漏的问题应该是解决了,布局类更新了,增加了新的东西, grid 的功能更加强大, tabs 也增加了循环按钮,还增加了类似 delphi action manager action 类,在反映速度上也有一定的提升,这些新功能确实很令人振奋,可惜正式版还没出来, API 也还没出来,所以想立刻使用 2.0 版做开发的,会有一定的困难。本文的目的就是和大家一起探讨一下 2.0 版的布局类,希望在 API 没有出来之前对大家的开发有所帮助,还有就是希望大家提供一些反馈意见,以便完善这篇文章。多谢!

Ext2.0 版的布局类,最大的改动是:

<!--[if !supportLists]--> 1、 <!--[endif]--> 取消了内容面板 contentPanel 类,代替的是 panel 类的。 panel 类中,会根据 layout 的定义不同自动生成布局样式,这样就不需要自己再去定义布局了,只要在 panel 定义中加入布局的定义就可以实现布局了。 panel 类派生出 formpanel girdpanel tabpanel treepanel 等子类,各子类中已根据自己的需要固定了不同的布局类型,例如在创建 formpanel 时会创建 formlayout

<!--[if !supportLists]--> 2、 <!--[endif]--> 增加 Container 类,并派生出 viewpoint 类作为全局布局的接口。

<!--[if !supportLists]--> 3、 <!--[endif]--> 取消了 layoutManger 类,增加了 ContainerLayout 类,而 borderLayout 类的父类也修改为 ContainerLayout

<!--[if !supportLists]--> 4、 <!--[endif]--> BasicLayoutRegion 类也取消了,因此它的子类 LayoutRegion 以及 LayoutRegion 类的子类 SplitLayoutRegion 都取消了。代替的是在 borderLayout 类下增加了 Region 类和 SplitRegion 类。

<!--[if !supportLists]--> 5、 <!--[endif]--> 在区域内再划分区域的 NestedLayoutPanel 类也根据框架的改变而取消了。至于如何再划分区域,请继续阅读本文。

<!--[if !supportLists]--> 6、 <!--[endif]--> 增加了 AccordianLayout AnchorLayout CardLayout CoulmnLayout FitLayout FormLayout TableLayout 等新的类。

<!--[if !supportLists]--> 7、 <!--[endif]--> 原有的用 contentPanel 可以做出的 tab 效果,现在则需要使用 tabpanel 实现。

随着类的继承关系的改变,布局的创建方法也做了很大的变动。我的看法是做这样大的框架的修改主要原因解决内存泄漏的问题。

我们先来了解一下新的布局类的继承关系:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75"coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"filled="f" stroked="f"><v:stroke joinstyle="miter" /><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0" /><v:f eqn="sum @0 1 0" /><v:f eqn="sum 0 0 @1" /><v:f eqn="prod @2 1 2" /><v:f eqn="prod @3 21600 pixelWidth" /><v:f eqn="prod @3 21600 pixelHeight" /><v:f eqn="sum @0 0 1" /><v:f eqn="prod @6 1 2" /><v:f eqn="prod @7 21600 pixelWidth" /><v:f eqn="sum @8 21600 0" /><v:f eqn="prod @7 21600 pixelHeight" /><v:f eqn="sum @10 21600 0" /></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /><o:lock v:ext="edit" aspectratio="t" /></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:290.25pt;height:248.25pt'><v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image001.jpg"o:title="Ext2" /></v:shape><![endif]--><!--[if !vml]--> Ext2.0布局类初探 <!--[endif]-->

从图中我们可以看出 Layout 类独立出来了,不再象 1.1 版那样继承自 Observable 类了。估计这样修改是未来避免内存泄漏的(猜的,水平有限,所以请多见谅)。

下面我们来看看各个类的情况:

<!--[if !supportLists]--> 1、 <!--[endif]--> Observable

    
      Observable
    
    类和
    
      1.1
    
    版的相同,没有修改,是一个抽象基类,为发布事件提供一个公共接口,其子类可通过
    
      
        addEvents
      
      方法
    
    增加事件。
    
      API
    
    可以直接参考
    
      1.1
    
      API
    

<!--[if !supportLists]--> 2、 <!--[endif]--> Component

Component 类和 1.1 版的相同,没有修改,是 Ext 组件的主要基类。 API 可以直接参考 1.1 API

<!--[if !supportLists]--> 3、 <!--[endif]--> BoxComponent

BoxComponent 类和 1.1 版的相同,没有改变,是需要使用盒子容器的可视化 Ext 组件的基类。 API 可以直接参考 1.1 API

<!--[if !supportLists]--> 4、 <!--[endif]--> Container

Container 类是新增加的一个基类。其主要作用是管理容器里的布局对象,负责布局对象的创建与摧毁。它通过一个 JSON 结构( Ext.Container.LAYOUTS={} )来保存布局对象,通过 layout 属性值和 items JSON 定义自动创建这些布局对象,并通过一个 JSON 结构记录这些布局对象,这样就可在面板对象生命周期内对其进行管理,防止布局中面板关闭时发生内存泄漏。 Container 类设置了布局中默认面板为 panel ,如果需要使用其它 panel ,则需要在 items 中进行定义。

<!--[if !supportLists]--> 5、 <!--[endif]--> Viewport

Viewport 类也是新增的一个类,是 Container 类的子类。 Viewport 类其实就是将页面 body 作为一个 Ext 对象,然后通过该对象管理 body 上的布局对象。 Viewprot 类的默认面板是 panel 面板,因为 panel 并没有指定特定的布局,所以要通过 layout 属性指定布局,并在 items 中定义的面板对象定义中加入该布局的定义。 Layout 属性可选的范围值为 container anchor form border column fit accordion card table

<!--[if !supportLists]--> 6、 <!--[endif]--> Panel

Panel 类是新增的面板基类。其基本的属性、方法和事件与 1.1 版的 contentPanel 相似, API 可参考 contentPanel API Panel 类和 contentPanel 类最大的不同是可以根据 layout 属性自动生成相应的布局,而不是和 1.1 版那样定义布局,然后加入 contentPanel 对象。

panel 类中增加了一个很好的功能,就是工具栏定义不再是 contentPanel toolbar 了,而是划分成了 tbar bbar tbar 就是 top bar ,在面板顶部的工具栏, babr bottom bar ,在面板底部的工具栏,这样就不用再为 toolbar 的位置犯难了,呵呵。

panel 类也不再象 contentPanel 那样本身就是一个 tab 面板,如果需要 tab 方式的面板,则需要用到新的 tabPanel 来定义。

<!--[if !supportLists]--> 7、 <!--[endif]--> ContainerLayout

ContainerLayout 类是新增的一个容器布局类,是其它布局的类的基类,其作用主要是为子类提供基本的属性、方法和事件: monitorResize( 是否 检测窗口大小的改变 ) activeItem (当前活动的对象)、 layout (子布局的类型)、 onLayout (显示布局事件)、 isValidParent (是否有有效的父节点)、 renderAll (输出内容)、 renderItem (输出某个子对象)、 onResize (大小改变时间)、 setContainer (设置容器)和 parseMargins (取消外补丁)。

<!--[if !supportLists]--> 8、 <!--[endif]--> B orderLayout

BorderLayout 类保持了 1.1 版的属性、事件和方法,只是其继承对象变成了 ContainerLayout 类。虽然其内部运作方法不同,但是还是可以根据 1.1 版的 API 去定义 BorderLayout 对象。

<!--[if !supportLists]--> 9、 <!--[endif]--> anchorLayout 类和 formLayout

anchorLayout 类是新增的类,它的源代码很简单,主要功能就是定义一个显示内容的空白区域。具体的应用看 layout 下的 anchor.html 文件看不出有什么特点,呵呵。

formLayout 也是新增的类,继承于 anchorLayout ,主要是为 formPanle 服务,创建 formPanel 时创建该布局,主要属性为 labelSeparator (标题分隔符)。

<!--[if !supportLists]--> 10、 <!--[endif]--> ColumnLayout

ColumnLayout 类是新增的类,替代 1.1 版的 Ext.form.Column 。代码书写方式比以前更简单更方便。

<!--[if !supportLists]--> 11、 <!--[endif]--> FitLayout 类、 Accordion 类和 CardLayout

FitLayout 也是新增的类,主要是创建一个适应容器大小的布局区域。没什么特殊的属性和方法。

Accordion 类是 FitLayoutd 类的子类,主要是创建类似 outlook bar 的效果,这是一个令人相当兴奋的功能,很多人估计早就盼望有这东西了。比使用 Ext.ux.Accordion 会方便很多。

CardLayoyt 也是一个新增的类,但是没有例子,所以不知道主要效果是什么。

<!--[if !supportLists]--> 12、 <!--[endif]--> tableLayout

tableLayout 类也是新增的类,主要目的是通过一个表格的形式划分区域。

其主要定义是通过“ layoutConfig: {columns:3} ”设置列数,通过“ defaults: {frame:true, width:200, height: 200} ”来设置每个 Item 的宽度和高度。每个 item 可通过类似 td 定义的方式设置设置格式,例如设置 rowspan 合并行, colspan 合并列等。

Ext 2.0 版要实现一个布局的主要代码就是通过 layout 设置布局的类型,然后定义 items 的面板对象,如果在内部再划分布局,实现 1.1 NestedLayoutPanel 的功能,只要在内部在面板内部再定义 items 就行了,比以前的代码书写方式更方便,更直观了。下面我们来分析一下 complex.html 这例子的定义。

例子首先创建了一个 Ext.Viewport 进行全界面布局,布局使用的是 bordeLayout layout:'border' )。在界面中总共划分了 north south wese east center 五个大区域。

north 区域使用了一个 Ext.BoxComponent 组件作为该区域的面板,它的 html 元件是 id 为“ north ”的 div el: 'north' ),高度是 32 height:32 )。

new Ext.BoxComponent({ // raw

region:'north',

el: 'north',

height:32

}),{

south 区域使用了 panel 作为区域的面板,因为 Viewprot 的默认面板类型为 panel ,所以不用 new Ext.Panel 的方式创建面板,直接书写定义代码就行了。在代码中,定义了内容的 html 元件是 id 为“ south ”的 div contentEl: 'south' ,带分隔控制条( split:true ),初始高度是 100 height: 100 ,不再使用以前的 initialSize ),移动改变的尺寸最小高度为 100 minSize: 100 ),最大高度为 200 maxSize: 200 ),允许折叠( collapsible: true ),标题栏显示‘ South ’( title:'South' ),内补丁为( margins:'0 0 0 0' )。

}),{

region:'south',

contentEl: 'south',

split:true,

height: 100,

minSize: 100,

maxSize: 200,

collapsible: true,

title:'South',

margins:'0 0 0 0'

}, {

east 区域同样也是用 panel 作为其面板,标题为“ East Side ”,允许折叠,有分隔控制条,初始宽度是 225 ,最小宽度为 175 ,最大宽度为 400 ,内补丁为“ 0 5 0 <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="”">0<span lang="EN-US" style=""><span lang="EN-US">”</span></span></chmetcnv> 。在该区域还 划分了 一个用 fitLayout 作为布局的区域( layout:'fit' ),这里就不再象 1.1 版那样用 NestedLayoutPanel 再划分区域会出现的问题了。在 fitLayout 里放置了一个 tabpanel 的面板,面板的没有边,当前激活的 tab 是第 2 个(注意 tab index 是从 0 开始的), tab 标签放置在底部,该 tab 定义了两个标签页。

}, {

region:'east',

title: '<place w:st="on">East Side</place>',

collapsible: true,

split:true,

width: 225,

minSize: 175,

maxSize: 400,

layout:'fit',

margins:'0 5 0 0',

items:

new Ext.TabPanel({

border:false,

activeTab:1,

tabPosition:'bottom',

items:[{

html:'<p>A TabPanel component can be a region.</p>',

title: 'A Tab',

autoScroll:true

},

new Ext.grid.PropertyGrid({

title: 'Property Grid',

closable: true,

source: {

"(name)": "Properties Grid",

"grouping": false,

"autoFitColumns": true,

"productionQuality": false,

"created": new Date(Date.parse('<chsdate w:st="on" isrocdate="False" islunardate="False" day="15" month="10" year="2006">10/15/2006</chsdate>')),

"tested": false,

"version": .01,

"borderWidth": 1

}

})]

})

},{

west 区域也是用 panel 作为面板, html 元件为“ west-panel ”,显示标题为“ West ”,有分隔控制条,初始宽度为 200 ,最小宽度为 175 ,最大宽度为 400 ,允许折叠,内补丁为“ 0 0 0 <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5" unitname="”">5<span lang="EN-US" style=""><span lang="EN-US">”</span></span></chmetcnv> 在区域内部 使用 accordion 布局划分两个区域。这个内部布局变动会显示动画( layoutConfig:{animate:true} )。

},{

region:'west',

id:'west-panel',

title:'West',

split:true,

width: 200,

minSize: 175,

maxSize: 400,

collapsible: true,

margins:'0 0 0 5',

layout:'accordion',

layoutConfig:{

animate:true

},

items: [{

contentEl: 'west',

title:'Navigation',

border:false,

iconCls:'nav'

},{

title:'Settings',

html:'<p>Some settings in here.</p>',

border:false,

iconCls:'settings'

}]

},

center 区域和 1.1 版的一样,是必需使用。在这里 center 区域不再使用默认的 panel 作为面板了,而是使用 tab 面板作为其面板( new Ext.TabPanel )。在代码里定义了两个标签页,激活的是第 1 个标签页。

new Ext.TabPanel({

region:'center',

deferredRender:false,

activeTab:0,

items:[{

contentEl:'center1',

title: 'Close Me',

closable:true,

autoScroll:true

},{

contentEl:'center2',

title: 'Center Panel',

autoScroll:true

}]

})

以上是我关于 2.0 版的布局类的一些理解和分析,因水平有限,难免会有错漏和偏差,希望大家原谅,多谢!

Ext2.0布局类初探


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论