概述

在页面中,比较棘手的地方就是布局。而要实现布局,就得有能维护布局的容器。可以说,在我试过和使用过的Javascript框架中,Ext JS的布局是做得最棒的一个,而这得益于它强大的容器类和丰富的布局类。在本文将介绍Ext JS的容器组合和布局类。

容器:Ext.container.Container

容器的主要功能是管理其内部的组件,因而在继承Ext.Component的全部功能的基础上,添加了对应的用来处理内部组件的方法add、insert、remove和removeAll。在配置项方法,则添加了items配置项用来添加内部组件,添加了layout配置项用来定义布局。

由于容器没有更改Ext.Component的渲染标记,因而,容器还是一个DIV而已,是一个轻量容器。

现在考虑这样一个问题,如果我要在容器中定义10个按钮,这样就要在容器的items里定义10个按钮的配置对象。在定义这些按钮的配置对象的时候,有些代码是相同,如“xtype:’button’”,那我就不得不复制粘贴9次,是不是觉得很烦?为了解决这个问题,在容器中特意添加了defaultType配置项,用来指定容器内默认组件的类型,如果没有特别设置,默认会使用面板(Ext.panel.Panel)作为默认组件。现在,默认组件解决了,但是如果有相同的配置项怎么办?这个可通过defaults配置项来实现。

组件查询

由于容器要管理它内部的组件,因而如何查找组件就成了所需的功能。在容器中,通过混入Ext.mixin.Queryable为容器添加了组件查询的功能。

在Ext JS 3,引入了Ext.getCmp方法,根据组件的id来查询组件,但对重复使用的视图以及大项目开发中,通常都会造成id冲突,因而,在Ext JS 4中引入了itemdId和组件查询类(Ext.ComponentQuery)。要根据itemId来查找组件,就必须先找到它的父容器,因为itemId的作用范围是它的直接父组件内的,也就是说,在别的容器,你可以定义相同的itemId,这样也不会造成id冲突,但在查询的时候要注意了,如果不是在直接父组件内查询itemId,可能找到的并不是你所需容器的组件,很可能是另外一个容器的组件,因而,要使用itemId查询组件,最好还是通过直接父组件进行查询。

组件查询类就有点类似于DOM查询,可以通过组件的id、itemId、类型、属性搭配通配符来查找组件。在Ext.mixin.Queryable类中,为容器添加了7个组件查询的方法,而我们开发中最常有的应该就是down方法,该方法的作用是用来查找符合传递给方法的选择符的第一个子组件。

组件查询虽然很方便很灵活,但是如果内部组件很多的时候,就可能存在性能问题,因而,在Ext JS 5,与视图控制器相匹配,引入了reference配置项,可在视图控制器使用lookupReference来查找组件,由于在视图控制器中,会为定义了reference配置项的组件建立缓存,因而查询起来相当快捷,建议多使用reference。具体有关reference的信息,可参阅《【翻译】在Ext JS 5种使用ViewControllers》一文。

布局

布局是与容器紧密相连的,就算在容器内没有定义配置项layout,容器也会使用默认的布局来渲染布局,例如,在一个空页面运行以下Ext JS代码创建一个800×800的空的容器:

Ext.create('Ext.container.Container',{
renderTo: Ext.getBody(),
width:800,
height:800
});

会在firebug的HTML面板内看到以下THML代码:

<div id="container-1009" role="presentation" style="width:800px;height:800px;" class="x-container x-container-default x-border-box">
<div role="presentation" class="x-autocontainer-outerCt" data-ref="outerCt" id="container-1009-outerCt" style="width: 100%; table-layout: fixed; height: 100%;">
<div class="x-autocontainer-innerCt" role="presentation" style="" data-ref="innerCt" id="container-1009-innerCt"> </div>
</div>
</div>

在HTML代码中,最外一层的代码就是容器的DIV标记,而里面两层的DIV是布局的DIV标记。如果对以上代码有所怀疑,可以查看一下容器默认布局——自动布局(Ext.layout.container.Auto)的类定义文件,在文件内查找renderTpl属性,就可以看到自动布局的渲染模板了,对比一下模板的HTML代码就知道是否是布局的HTML代码了。

要注意的是,类似自适应布局或卡片布局这样的布局,是没有布局代码的,因为这些布局直接把容器内组件的顶层DIV的尺寸调整为容器的尺寸就行了,不需要辅助HTML标记来计算布局,而该内部组件的内部组件的布局是通过他的内部布局去计算的,不涉及它的父容器。

以上是了解和熟悉布局的一种很好的方法。大家可以更改容器的布局,然后在firebug中查看这些布局生成的HTML代码从而了解他们与容器之间的关系以及布局实现的方式,这样可加深布局的了解,在使用布局的时候,也就可以知道他们会生成什么样的HTML代码,会产生什么样的效果。例如,使用水平盒子布局和列布局都可以将容器划分为几列,如果了解了他们的实现方式,就会发现列布局是通过”float:left”来实现列的划分的,也就是子组件是先堆满一行,再堆砌第二行的方式来实现;而水平盒子则是使用绝对定位(position: absolute !important;)来实现列的划分的,也就是每列的子组件都是固定在他们列的DIV元素内的。这两种不同的实现方式也就决定了子组件的行为方式是不同,列布局中的子组件由于使用“float:left”,就会很容易受子组件的尺寸影响,极度容易在容器的右边出现空白,要花费很多功夫去调整容器或者子组件的尺寸才能获得好的效果,这对于会自动根据浏览器调整尺寸的容器来说,绝对算不上是好的选择。使用水平盒子布局就不存在这样的问题,因为位置是固定的,而且布局会自动调整。水平盒子布局唯一不好的地方是,在布局内放置的是输入字段,而又希望字段能通过TAB键来导航的时候,会发现字段的切换是先切换完第一列才跳到第二列。造成这样的原因是因为浏览器中焦点的切换是先切换完一个顶层元素内的子元素,再切换到另一个顶层元素的子组件,这个解决的办法也很简单,为字段定义tabIndex就行了。

小结

容器其实是一个很简单的组件,但与其绑定的布局则是一个比较复杂的东西,尤其是在配置布局的时候,有些布局,只需要在容器内简单做些定义就行了,如自适应布局和卡片布局,而有些布局则需要在子组件内也有相应的定义,如边框布局,因而会造成一些混乱,但如果熟悉了各种布局的实现方式和具体特点,就可以很轻松自如的应付各类型的页面布局了。在下一篇文章,将具体介绍各种布局的使用方法。

请大家尊重作者的辛勤劳动,未经允许,请不要转载本文,毕竟读者的支持是作者撰写文章的动力。

谈谈Ext JS的组件——容器与布局的更多相关文章

  1. 谈谈Ext JS的组件——布局的用法续二

    绝对布局(Ext.layout.container.Absolute) 绝对布局让我回忆到了使用Foxpro开发的时候,哪时候的界面布局就是这样.通过设置控件的左上角坐标(x.y)和宽度来进行的,由于 ...

  2. 谈谈Ext JS的组件——布局的使用方法续二

    绝对布局(Ext.layout.container.Absolute) 绝对布局让我回想到了使用Foxpro开发的时候,哪时候的界面布局就是这样,通过设置控件的左上角坐标(x,y)和宽度来进行的,因为 ...

  3. 谈谈Ext JS的组件——组件基类:Ext.Component

    概述 Ext.Component是所有Ext组件的基类,这在Ext.Component的API中第一句话就提到了.然后第二段说明了它包含的基本功能:隐藏/显示.启用/禁用以及尺寸控制等.除了以上这些基 ...

  4. 谈谈Ext JS的组件——布局的用法

    概述 在Ext JS中.包括两类布局:组件类布局和容器类布局.由于有些组件是有不同的组件组合而成的,如字段就由标题和输入框构成,他们之间也是存在布局关系的,而这就须要组件类布局来处理组件内自己特有的布 ...

  5. 谈谈Ext JS的组件——布局的使用方法

    概述 在Ext JS中,包含两类布局:组件类布局和容器类布局.由于有些组件是有不同的组件组合而成的,如字段就由标题和输入框构成,他们之间也是存在布局关系的,而这就需要组件类布局来处理组件内自己特有的布 ...

  6. 谈谈Ext JS的组件——布局的使用方法续一

    盒子布局 盒子布局主要作用是以水平(Ext.layout.container.HBox)或垂直方式(Ext.layout.container.VBox)来划分容器区域.这也是比较常有的布局方式. 使用 ...

  7. 谈谈Ext JS的组件——布局的用法续一

    盒子布局 盒子布局主要作用是以水平(Ext.layout.container.HBox)或垂直方式(Ext.layout.container.VBox)来划分容器区域.这也是比較常有的布局方式. 使用 ...

  8. Ext.js高级组件

    第二章:Ext.js高级组件 grid组件 普通方式 表格面板类Ext.grid.Panel xtype(别名):gridpanel.grid title标题.renderTo渲染至.width宽.h ...

  9. 谈谈Ext JS组件之引子

    Ext JS组件,对于Ext JS开发人员来说,应当不会陌生,毕竟做开发,都必须与它打交道.对于这样一个大家都熟悉的东西,为什么要用一个专题的形式来写呢?是否有这方面的需要?还不如去写点使用技巧? 确 ...

随机推荐

  1. 渗透测试环境DVWA搭建

    一.DVWA介绍 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供 ...

  2. 关于java的Synchronized,你可能需要知道这些(上)

    对于使用java同学,synchronized是再熟悉不过了.synchronized是实现线程同步的基本手段,然而底层实现还是通过锁机制来保证,对于被synchronized修饰的区域每次只有一个线 ...

  3. sourcestress 问题解决方案

    描述:在Windows系统下,在保证GitHub上的账号和密码正确的情况下,在push时候,输入正确的账号和密码后,却是提醒无效的账户密码. 解决方法:在C:\Users\...\AppData\Lo ...

  4. iOS中的颜色

    最近在改Bug的时候,才注意到iOS 中的颜色竟然也大有文章,特来记录一下. 先说一下问题,因为某界面中有用xib实现的一个view,而这个view 只在UIColletionView的layout ...

  5. 使用Spring Boot开发Web项目(二)之添加HTTPS支持

    上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...

  6. CentOS环境下使用GIT基于Nginx的私服搭建全过程

    阅读本文前你必须预先装好CentOS并且已经安装和配置好Nginx了. 安装GIT私服套件 安装centos6.5-centos7.0 安装nginx yum install -y?git gitwe ...

  7. 在android系统上写C语言程序--开机启动该程序不进入安卓系统

    今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直 ...

  8. PHP学习(3)—在HTML中嵌入PHP

    我们以一个提交订单和显示订单信息的例子为学习PHP的开始.这个例子包含两个文件.一个提交订单的html文件:orderform.html,一个显示订单信息的php文件:processorder.php ...

  9. Linux动态频率调节系统CPUFreq之二:核心(core)架构与API

    上一节中,我们大致地讲解了一下CPUFreq在用户空间的sysfs接口和它的几个重要的数据结构,同时也提到,CPUFreq子系统把一些公共的代码逻辑组织在一起,构成了CPUFreq的核心部分,这些公共 ...

  10. 使用Android Studio向GitHub提交代码

    使用Android Studio向GitHub提交代码 在GitHub上创建一个仓库 填写仓库名称.描述.类型(公有.私有)等信息,点击创建 到此,成功创建了我们的仓库,并且初始化创建了README. ...