- 浏览: 234712 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
annyliyear:
找到的ExtJS实现多选下拉框3个代码 -
yinboxian:
源码太乱了
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
yinboxian:
我的peers第一次执行时可以得到正确的结果,以后就不行了。不 ...
JXTA中基于管道监听方式通信 -
cuizhenfu#gmail.com:
http://www.cnblogs.com/cuizhf
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
luxing44530:
请问, jsp页面如果在 META-INF 中, 改怎么访问? ...
Servlet3.0 新特性之模块化实践
使用ExtJs创建新的UI控件
此文档介绍了怎么在ExtJS 2.x的库中,把现有类的能力扩展为新的用户界面控件。如果阁下想就此文进行讨论,请到论坛的帖子。
组合或扩展
当创建一个新类,往往要作出这么的一个选择:要么拥有某个工具类的实例来扮演首要的角色,要么扩展那个类。
使用ExtJs过程中,推荐从最靠近的基类开始扩展,实现所需的功能即可。这是因为Ext提供的自动生存周期引入了自动渲染的机制、自动大小调整和承担接受来自布局管理器的UI组件布局调控,还有在容器(Container)中自动销毁的功能。
组织一个新类,它就是ExtJs的类,实现起来是很方便的,这就会导致了Container→Component层次的形成,相比较,新类拥有一个ExtJs类的话,必须从外围对其渲染和组织。
The Template method Pattern模板方法模式
Ext Js的Component的继承层次采用Template Method pattern(模板方法模式)来委派给子类,交由子类来负责其特定的行为。
其意义在于,继承链中的每个子类得以在,组件生存周期的某个阶段内,“提交(contribute)”额外的逻辑功能。这样每一个类拥有属于其自身的行为;其他类加入自己的行为时也不会相互造成影响。
其中一个例子是render(渲染)函数。render函数不能够被覆盖,应该是一层一层地在各子类的实现中加入onRender方法,那么render函数就会在执行的时候把各onRender方法访问调用。每一个onRender方法必须调用其父类的onRender方法继而再“埋头处理(contribute)”自己(子类)的逻辑部分。
下面的图例演示了模板方法onRender的机能过程。
render是由容器的布局管理器(Container’s layout manager)负责调用。该方法的实现不能被“冲掉(overridden)”,它是由Ext基类提供的。this.onRender表示当前子类所写的实现(如有提供的话)。它会访问父类的版本、父类的版本又会调用父、父类的版本……最终,每个类完成了其功能,render函数的返回值对生存周期进行控制。
在ExtJS组件(Component)生存周期中,提供了若干有意义的模板方法以实现类特定的逻辑功能。
强调: 当编写子类时,模板方法应在实例化的过程中调用,属于生存周期内的一部分的动作,而不应是事件的一部分。事件有可能会由handler挂起,或中止。
以下是Component子类都可享有的模板方法:
- onRender
- afterRender
- onShow
- onHide
- onDisable
- onEnable
- onDestroy
Ext组件类的各层次中的均有其自身的模板方法,我们可以打开来看看,这些都是根据自身不同的需求而作出的设计。
提示: 当调用父类的模板方法时,最简洁的方法就是使用Function.apply,保证所有的参数都可以接受得到,传送给那个模板方法:
Ext.ux.Subclass.superclass.onRender.apply(this, arguments);
要扩展哪个类
选择适合的类来扩展不但要考虑基类提供哪些功能,而且对性能方面也要着重考虑。无论有多少个UI控件被渲染或调控,Ext.Panel常常就是被衍生(extend)的对象。
Panel类拥有许多的能力:
- Border(躯干)
- Header(头部)
- Header工具条
- Footer(底部)
- Footer按钮
- Top toolbar(顶部工具条)
- Bottom toolbar(底部工具条)
- 承托和管理子组件
如果这些派不上用场,那使用Panel便是资源浪费。
Component(组件类)
如果要求的UI控件不需要其他的细节的控件,也就是,仅仅是封装某部分的HTML元素的话,那么可取的扩展对象就是Ext.BoxComponent或Ext.Component。如果再缩窄一步,我不需要听凭父容器提供的大小调控功能,那么使用Ext.Component就可以了。
强调: Component类并不会内省而得知哪一种元素作为holder。因此为了创建所需的元素(Element),应设定autoEl的配置项。
例如,要把一张图片封装为Component,我们于是乎这样定义:
Ext.ux.Image = Ext.extend(Ext.Component, { autoEl: { tag: 'img', src: Ext.BLANK_IMAGE_URL, cls: 'tng-managed-image' }, // Add our custom processing to the onRender phase. // We add a ‘load’ listener to our element. onRender: function() { Ext.ux.Image.superclass.onRender.apply(this, arguments); this.el.on('load', this.onLoad, this); }, onLoad: function() { this.fireEvent('load', this); }, setSrc: function(src) { this.el.dom.src = src; } });
这是一个可封装图片的Ext Component类,可参与非箱子方寸模型(non box-sizing)的布局。
BoxComponent
如果要求的UI控件不需要其他的细节的控件,也就是,仅仅是封装某部分的HTML元素的话,还要听凭布局管理器提供的大小尺寸、布局的调控,那么这个的扩展对象就是Ext.BoxComponent。
例如,假设一个Logger类打算是简单地显示log信息,就必须嵌入某种布局的风格,例如插入到一个layout:’fit’窗体,可以这样定义:
Ext.ux.Logger = Ext.extend(Ext.BoxComponent, { tpl: new Ext.Template("<li class='x-log-entry x-log-{0:lowercase}-entry'>", "<div class='x-log-level'>", "{0:capitalize}", "</div>", "<span class='x-log-time'>", "{2:date('H:i:s.u')}", "</span>", "<span class='x-log-message'>", "{1}", "</span>", "</li>"), autoEl: { tag: 'ul', cls: 'x-logger' }, onRender: function() { Ext.ux.Logger.superclass.onRender.apply(this, arguments); this.contextMenu = new Ext.menu.Menu({ items: [new Ext.menu.CheckItem({ id: 'debug', text: 'Debug', checkHandler: Ext.ux.Logger.prototype.onMenuCheck, scope: this }), new Ext.menu.CheckItem({ id: 'info', text: 'Info', checkHandler: Ext.ux.Logger.prototype.onMenuCheck, scope: this }), new Ext.menu.CheckItem({ id: 'warning', text: 'Warning', checkHandler: Ext.ux.Logger.prototype.onMenuCheck, scope: this }), new Ext.menu.CheckItem({ id: 'error', text: 'Error', checkHandler: Ext.ux.Logger.prototype.onMenuCheck, scope: this })] }); this.el.on('contextmenu', this.onContextMenu, this, {stopEvent: true}); }, onContextMenu: function(e) { this.contextMenu.logger = this; this.contextMenu.showAt(e.getXY()); }, onMenuCheck: function(checkItem, state) { var logger = checkItem.parentMenu.logger; var cls = 'x-log-show-' + checkItem.id; if (state) { logger.el.addClass(cls); } else { logger.el.removeClass(cls); } }, debug: function(msg) { this.tpl.insertFirst(this.el, ['debug', msg, new Date()]); this.el.scrollTo("top", 0, true); }, info: function(msg) { this.tpl.insertFirst(this.el, ['info', msg, new Date()]); this.el.scrollTo("top", 0, true); }, warning: function(msg) { this.tpl.insertFirst(this.el, ['warning', msg, new Date()]); this.el.scrollTo("top", 0, true); }, error: function(msg) { this.tpl.insertFirst(this.el, ['error', msg, new Date()]); this.el.scrollTo("top", 0, true); } });
接着是CSS:
.x-logger { overflow: auto; } .x-log-entry .x-log-level { float: left; width: 4em; text-align: center; margin-right: 3px; } .x-log-entry .x-log-time { margin-right: 3px; } .x-log-entry .x-log-message { margin-right: 3px; } .x-log-debug-entry, .x-log-info-entry, .x-log-warning-entry, .x-log-error-entry { display: none; } .x-log-show-debug .x-log-debug-entry { display: block } .x-log-show-info .x-log-info-entry { display: block } .x-log-show-warning .x-log-warning-entry { display: block } .x-log-show-error .x-log-error-entry { display: block } .x-log-debug-entry .x-log-level { background-color: #46c } .x-log-info-entry .x-log-level { background-color: green } .x-log-warning-entry .x-log-level { background-color: yellow } .x-log-error-entry .x-log-level { background-color: red }
我们吧log的信息的HTML列表均放置在一个布局中。我们在onRender的阶段加入处理,使得右键菜单可以根据CSS样式类的名称操控logged条目的可见性。位于该层次的对象还提供了特别的模板方法:
- onResize
- onPosition
Container(容器类)
如果要求的UI控件将用于承载(Contain)其他UI元素在其身上,但并不需要前文提及到的Ext.Panel那么多的功能,为避免臃肿,应采用Ext.Container容器类来继承。同样地,autoEl指定元素的配置项亦必不可少,将用于容器在某个元素之上进行渲染。同样,在视觉控制方面,滚动条是否显示方面(即overflow属性),用户都可以使用Style配置项,或容器元素的class属性的两种方式进行CSS样式制定。
注意: 对于Container层次,不要忘记哪种布局类是被用于渲染和调控子组件的。
示例中的类封装了条件命令的查询,允许用户对Store基于测试字段的数据筛选。除了功能上的封装外,还把查询任务作统一布局,封装在一个可控类中,可方便从容器身上自动添加或移除查询的条目,灵活性更高:
Ext.ux.FilterCondition = Ext.extend(Ext.Container, { layout: 'table', layoutConfig: { columns: 7 }, autoEl: { cls: 'x-filter-condition' }, Field: Ext.data.Record.create(['name', 'type']), initComponent: function() { this.fields = this.store.reader.recordType.prototype.fields; this.fieldStore = new Ext.data.Store(); // Create a Store containing the field names and types // in the passed Store. this.fields.each(function(f) { this.fieldStore.add(new this.Field(f)) }, this); // Create a Combo which allows selection of a field this.fieldCombo = new Ext.form.ComboBox({ triggerAction: 'all', store: this.fieldStore, valueField: 'name', displayField: 'name', editable: false, forceSelection: true, mode: 'local', listeners: { select: this.onFieldSelect, scope: this } }); // Create a Combo which allows selection of a test this.testCombo = new Ext.form.ComboBox({ triggerAction: 'all', store: ['<', '<=', '=', '!=', '>=', '>'] }); // Inputs for each type of field. Hidden and shown as necessary this.booleanInput = new Ext.form.Checkbox({ hideParent: true, hidden: true }); this.intInput = new Ext.form.NumberField({ allowDecimals: false, hideParent: true, hidden: true }); this.floatInput = new Ext.form.NumberField({ hideParent: true, hidden: true }); this.textInput = new Ext.form.TextField({ hideParent: true, hidden: true }); this.dateInput = new Ext.form.DateField({ hideParent: true, hidden: true }); this.items = [ this.fieldCombo, this.testCombo, this.booleanInput, this.intInput, this.floatInput, this.textInput, this.dateInput]; Ext.ux.FilterCondition.superclass.initComponent.apply(this, arguments); }, onFieldSelect: function(combo, rec, index) { this.booleanInput.hide(); this.intInput.hide(); this.floatInput.hide(); this.textInput.hide(); this.dateInput.hide(); var t = rec.get('type'); if (t == 'boolean') { this.booleanInput.show(); this.valueInput = this.booleanInput; } else if (t == 'int') { this.intInput.show(); this.valueInput = this.intInput; } else if (t == 'float') { this.floatInput.show(); this.valueInput = this.floatInput; } else if (t == 'date') { this.dateInput.show(); this.valueInput = this.dateInput; } else { this.textInput.show(); this.valueInput = this.textInput; } }, getValue: function() { return { field: this.fieldCombo.getValue(), test: this.testCombo.getValue(), value: this.valueInput.getValue() }; } });
此类管理了其包含的输入字段,可以精确的布局-大小调整,外补丁等等——都是通过CSS样式分配到元素身上这样来起作用的。
位于该层次的对象还提供了特别的模板方法:
- onBeforeAdd
Panel
如果所需的UI控件要求头部、底部、或工具条之类的元素,那么Ext.Panel就是一个很不错的类给予继承了。
注意: Panel是容器的一种,不要忘记哪种布局类是被用于渲染和调控子组件的。
通常Ext.Panel所实现的类会有很高的程序结合性,一般用于与其他UI控件协调使用(通常Containers,或表单字段),并对其有特定配置的布局风格。另外,要对在其内的组件提供操作的命令,可以从tbar(顶部工具栏),bbar(底部工具栏)的两方面设置加以控制。
Field
如果所需的UI控件要求为用户交互,可以把程序的数据显示给用户,或修改进而发生给服务器的功能,那么要被扩展的类应该是Ext.form.TextField,或Ext.Form.NumberField。另外,如果要求轮换按钮(Trigger button),以备键盘按键的轮换,那就是Ext.form.TriggerField。
位于该层次的对象还提供了特别的模板方法:
- onFocus:input输入框得到焦点后即会触发该方法的执行。
- onBlur:input输入框失去焦点后即会触发该方法的执行。
什么时候不需要子类
有些时候,滥用子类无异于“杀鸡用牛刀”。在一些特定应用场合,某个现有的类它的方法被添加、被重写,是由这个类的构造器实例化过程中依靠参数传入的。
发表评论
-
自定义ListView背景
2012-10-23 09:06 0在Android中,ListView是最常用的一个控件,在做U ... -
TabPanel 加载多个 SWF 需要注意的问题。
2012-02-24 10:11 1330第1个问题,切换TabPanel的时候,有些Tab加载不到SW ... -
ExtJs中2个常用的高级事件功能:委托(Delegation),缓冲(Buffer)
2012-02-24 09:47 1359委托delegation 减低内存销毁和防止内存泄露的隐患是 ... -
ExtJs实现SearchGrid查询表格
2011-08-22 02:19 3473实现在表格头部下文可以有对应的查询框,如附件图。代码如下: ... -
ExtJs监听FormPanel的数据的更新情况
2011-08-21 18:17 3042最近项目提出一个新的需求: FormPanel面板当前 ... -
ExtJs中的CheckboxSelectionModel功能的完善
2011-08-17 23:44 5996所谓说要完善CheckboxSelectionModel功能, ... -
ExtJs实现刷新Grid单个单元格
2011-08-17 01:10 4766产生问题背景: ExtJS3.2版本 页面上存在定时刷新表 ... -
使用ExtJs开发项目总结
2011-08-09 00:38 17961、少用IFrame,或者不要 ... -
ExtJs TabPanel右键功能插件
2011-08-09 00:17 1942下面是ExtJs TabPanel右键功能插件,可以全部 ... -
ExtJs自定义带Form功能的Window
2011-08-08 23:58 3593之前在项目遇到一个问题就是使用很多的Window进行新增 ... -
Ext与RESTful Web Services(转载)
2011-04-19 23:29 1801REST与RESTful Web Services 表述性 ... -
如何本地化ext的教程(转载)
2011-04-19 23:28 1056引言 如果你是英语的用户就不必做任何本地化的工作了,这篇教程 ... -
扩展Ext中的组件(转载)
2011-04-19 23:22 894引言 起初,Ext.extend()干的不错,它使你能够建 ... -
如何合理规划一个Ext应用程序(转载)
2011-04-19 23:19 1113事前准备 本教程假设你已经安装好ExtJS库。安装的目录是e ... -
扩展Ext的新手教程(转载)
2011-04-19 23:12 1064一般你会希望使用类(class)来诠释面何对象的思想。本教程的 ... -
使用ExtJs如何框架一个大型网站?
2011-04-03 21:42 1601使用ExtJs开发项目问题: 1、如何管理大量的Js文件。 ... -
ddddddd
2011-01-16 15:24 0dddddd -
Ext.tree.panel中如何每次点击展开都从后台加载
2010-12-18 00:54 3711昨天为了项目需要在做异步加载树时,碰到一个每次点击节点都重新, ...
相关推荐
EXT UI效果模板是一款专为开发者设计的前端界面模板集合,主要基于EXT库的3.2.0版本。EXT是一个强大的JavaScript框架,它提供了...无论你是要创建一个新的项目,还是要改进现有的EXT应用,这款模板都是值得信赖的资源。
Ext.NET控件是一种将流行的JavaScript库Ext JS与微软的.NET框架相结合的技术,旨在为开发者提供在ASP.NET环境中创建丰富交互式Web应用的能力。通过将Ext JS的功能集成到.NET控件中,开发人员可以利用.NET的强大后端...
EXT控件是EXT框架的基础,它们提供了丰富的UI元素,如按钮、表格、面板、窗口等。通过EXT自定义控件扩展,开发者可以进一步拓展这些基础控件的功能,或者创建全新的控件类型,以满足项目中的特殊需求。以下是一些...
教你创建Ext UI控件 事件的处理 Ext中的继承 Ext的类设计 Ajax通讯 JSON处理方法 函数的原型扩展 组件的使用: Tab标签页 Ext 1.x中的布局 Grid组件初学 Grid的数据分页 Ext菜单器件 表单组件初学 表单组件初学...
它提供了一整套组件化的UI元素,使得开发者能够轻松创建出具有桌面应用般用户体验的网页应用。在ExtJS 6中,时间控件是其组件库中的一员,用于处理用户输入时间的交互。"Ext时间控件.rar"这个压缩包很可能是包含了一...
EXT Designer是一款专为EXT UI框架设计的可视化设计工具,它极大地简化了EXT用户界面的创建过程,让开发者和设计师能够快速、高效地构建出复杂的Web应用程序界面。EXT UI是一种流行的JavaScript库,它提供了丰富的...
"Ext DateField控件 - 只选择年月"这个主题聚焦于一个特定的UI组件,用于帮助用户仅选择日期中的年份和月份部分,而忽略具体的日期。这在处理诸如生日、合同有效期等只需要年月信息的场景时非常有用。 Ext JS是一个...
ExtJS UI控件是用于构建丰富、交互性强的Web应用程序的JavaScript库,它与ASP.NET 3.5结合使用,可以为开发人员提供强大的前端开发工具。在ASP.NET 3.5框架下,ExtJS控件能帮助开发出具有桌面应用般体验的网页应用。...
根据提供的文件信息,我们可以深入探讨Ext控件的相关知识点。标题提到的是“Ext控件大全”,并且描述中指出这些资料非常适合IT人士尤其是新手学习使用。...希望本文能对你学习和使用Ext JS 控件有所帮助。
此外,它还支持双向数据绑定,使得UI控件能够实时反映后端数据模型的变化。 6. **布局管理**: ExtJS的布局系统在Ext.NET中得到充分利用,支持各种复杂的布局模式,如绝对布局、卡片布局、列布局、表单布局等,...
自己第一次用Ext做的时间段选择控件,是参考公司了另一同事的控件修改的希望对大家有用。
在这个场景中,EXT被用来创建时间和IP的输入控件。 2. **时间控件**: 时间控件允许用户以精确到分钟和秒的方式选择或输入时间。这通常涉及一个下拉式的时间选择器,用户可以方便地滚动选取小时、分钟和秒,或者直接...
1. **EXT4时间控件**:EXTJS4是Sencha公司开发的一个富客户端JavaScript框架,它包含了大量的UI组件,其中时间控件是其一。EXT4的时间控件基于jQuery UI,提供了丰富的样式和功能,可以轻松地与后台数据进行交互。 ...
EXT提供了丰富的UI组件,包括表格、面板、窗口、表单等,而日期时间控件则是表单组件中的一个重要部分。 "EXT日期时间控件"是一个专门用于显示和编辑日期及时间的控件,它可以精确到时、分、秒,满足了对时间精确度...
EXT日期时间控件2是一款基于EXT JavaScript库的高级UI组件,专为网页应用设计,用于提供用户友好的日期和时间选择功能。EXT是一个强大的前端框架,由Sencha公司开发,广泛应用于构建富互联网应用程序(RIA)。EXT的...
标题中的“UI组件(ext jquery ucren)”提及了三个关键词:EXT、jQuery和ucren,这些都是在Web开发中常见的UI(用户界面)组件库。接下来,我们将详细探讨这三个技术及其在构建用户界面中的作用。 EXT是一个强大的...
如果默认的DateTimeField不能满足所有需求,开发者可以通过EXT的MVC模式或组件继承机制,创建自定义的时间控件,增加新的功能或调整样式。 7. **无障碍性(Accessibility)**: 在设计EXT应用时,应考虑无障碍性...
Ext是一个Ajax框架,用于在客户端创建丰富多彩的web应用程序界面,是在Yahoo! UI的基础上发展而来的。官方网址:http://www.extjs.com/ Ext的几个特点 1、使用标准的W3C技术; 2、庞大的组件模型及控件库; 3...
EXT的核心在于其组件模型,它提供了一整套预定义的UI控件,如表格、面板、窗口、菜单等,开发者可以像搭建积木一样组合这些控件,快速构建出功能丰富的Web应用。而Coolite则是EXT的一个扩展,它在EXT的基础上,增加...
"Ext扩展控件,支持复制,粘贴,剪切"这个主题涉及到的是ExtJS中的自定义插件开发,用于增强其内置控件的功能,特别是添加了常见的文本编辑操作,如复制(Copy)、粘贴(Paste)和剪切(Cut)。 在标准的Web浏览器...