下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用Dijit实现界面组件化开发来源 : InfoQ发布时间: 2011-01-10 17:56阅读 : 151次原文链接全屏阅读收藏编辑点评: 菜单、树形控件、 对话框和进度条等组件,在现在的Ajax应用中十分常见,但是并不是HTML默认提供的。HTML 5规范中引入了一些新的元素,但还是不够。组件化对于Web应用本身的代码共享和团队分工也是很有意义的。对于组件化的软件工程设计,很多开发人员都比较熟悉。组件化的设计适合于复杂的软件系统和团队协作开发。把软件系统划分成若干个组件,组件之间通过预先定义好的接口和协议进行通讯和协作,共同完成整个软件系统的职责。团队中的开发人员可以各自负责不同的组件
2、。组件化的思想在桌面应用和Web 应用后台开发中比较流行,相关的技术和实践都比较成熟。而在 Web 应用的前端部分,组件化一直进展得比较缓慢。这其中的原因有很多,最主要的是 Web 应用的前端在开始的时候比较简单,没有组件化和设计的必要。随着Ajax应用的流行, Web 前端部分越发复杂,用户对 Web 应用的要求不断向桌面应用靠拢。HTML语言的基本界面元素不能单独地满足这样的需求。菜单、树形控件、 对话框和进度条等组件,在现在的Ajax应用中十分常见,但是并不是HTML 默认提供的。 HTML 5规范中引入了一些新的元素,但还是不够。组件化对于Web 应用本身的代码共享和团队分工也是很有意
3、义的。Web应用前端组件化的发展也是渐进的。开始的时候,只是一些简单的HTML 、CSS加上 JavaScript的代码示例。比如当需要实现一个多级菜单的时候,就下载相关的代码示例,就根据自己的需要进行修改。这样的组件比较难以复用。后来JavaScript框架开始流行的时候,有些框架本身就提供了组件的支持,包括Ext JS 、 jQuery UI和 Dojo等。不过不同框架提供的组件模型不尽相同。Dijit组件模型概述Web应用的前端组件的定义比较宽泛。一个组件占据Web 页面上的某个区域,并负责完成某项具体的任务。Web 组件有时候也被称为小部件(widget)。在Dijit组件模型中,一个
4、 Dijit组件是一个JavaScript类,可以在页面上通过new 操作符来创建组件的实例。每个组件实例都需要与页面上的某个DOM 元素绑定在一起。这个 DOM 元素就是该组件的根节点。在 Dijit 组件的逻辑中,就可以对该根节点进行操纵来构建用户界面。组件 JavaScript 类暴露出来的属性和方法就是该组件的接口。Dijit组件的使用Dijit组件的使用方式非常简单。首先需要在页面上加载组件的JavaScript代码,这通过dojo.require函数就可以完成。接着在页面上找到或创建一个DOM元素作为该组件的根节点。最后通过new操作符创建即可。如new dijit.form.Co
5、mboBox(, node)就可以用node作为根元素创建一个dijit.form.ComboBox组件,即一个下拉列表选择框。可以看到创建Dijit组件的时候,使用了两个参数:第二个参数是组件的根元素,如果创建的时候不指定该根元素,会自动创建一个新的DIV元素作为根元素。不过该新创建的根元素一般没有加入到当前的文档树中,可以通过组件的placeAt方法来设置该组件在页面文档树中的位置。第一个元素则是一个JavaScript对象,包含了组件的配置属性。通常来说,一个Dijit组件是可以复用的。因此一般都会提供一些属性供使用者进行配置。通过这个参数,就可以修改这些配置。上面提到的是程序式的方式创
6、建Dijit组件,还有另外的一种方式来进行创建,即通过在 HTML 代码中以声明式的方式创建,如 对话框标题 对话框内容 写声明式的方式在一定程度上简化了开发人员使用HTML 代码的形式类似,只需要在一般的HTMLDijit 组件的方式。声明式的方式与编元素上添加一些额外的属性就可以把HTML 片段转换成Dijit组件。这对于只熟悉HTML 语言的人来说非常方便,相当于在 HTML语言的基本元素之上,增加了更多的可用组件。Dijit深入分析Dijit组件基本类所有的 Dijit组件都继承自dijit._Widget类。 dijit._Widget类中定义了与组件相关的一系列方法。 这些方法中有
7、一些是与组件生命周期相关的,有一些则是所有组件都需要的通用方法。了解Dijit组件的生命周期有利于理解Dijit组件的运行方式,从而更好的使用已有的组件或开发出自己的组件。创建 Dijit组件的过程开始于dijit._Widget类中的 create方法。 create方法采用了典型的模板方法设计模式,即在该方法中封装了创建组件的基本流程。该方法会执行一些重要的操作,并依次调用其它的方法来完成整个创建过程。具体的流程包括:把创建时的配置参数混入(mix-in)到组件中。比如在创建组件的时候使用的方式是 var myWidget = new TestWidget(prop : Hello, no
8、de);,那么在创建完成之后就可以通过myWp来获取到Hello,在组件中也可以通过p来访问。调用生命周期方法:postMixInProperties。该方法在配置参数混入之后调用,可以对混入的参数进行修改。把该新创建出来的组件添加到全局的组件对象注册表中。Dijit组件都会被分配一个惟一的标识符。添加到注册表中之后,就可以用dijit.byId来根据标识符获取组件对象。调用生命周期方法:buildRendering。该方法用来完成构建组件的用户界面。该方法负责设置this.domNode的值,表示的是创建完成的组件的根元素。调用生命周期方法:postCrea
9、te。该方法在用户界面构建完成之后被调用。一般是组件内部行为逻辑的起点,类似HTML 页面中的onload方法。对于 Dijit组件开发人员来说,创建一个新的Dijit非常简单。只需要用dojo.declare声明一个JavaScript类并继承自dijit._Widget,在该类中覆写感兴趣的JavaScript方法即可。最简单的情况是覆写postCreate方法并添加组件的逻辑。对于用来包含其它子组件的容器类组件来说,一般会覆写startup方法来让其调用者显式的启动这个组件。这是因为在postCreate被调用的时候, 只是保证了组件的DOM 节点已经被创建成功了,但是这些 DOM 节点
10、可能并没有被添加到当前文档树中,因此不能在postCreate中包含与DOM 节点大小和位置相关的代码。如果要添加这样的代码,应该在startup中添加。很多容器类组件都使用该方法来对其子节点进行布局。使用 HTML模板如果只是使用dijit._Widget的话,编写Dijit组件会比较繁琐。比如在构建用户界面的时候,可能会需要很多的DOM 操作,编写起来也不方便。Dijit提供了 dijit._Templated用来使用HTML 片段来定义组件的内容。HTML 片段是作为组件的内容模板。如:dojo.declare(TempWidget, dijit._Widget, dijit._Temp
11、lated,templateString : Hello);TempWidget继承了两个JavaScript类,除了必需的dijit._Widget之外,还有dijit._Templated的。需要保证意义上的父类,其余的是混入类。dijit._Widget dijit._Templated是父类数组的第一个元素,只有它是真正类已经覆写了buildRendering方法来从HTML模板中创建组件内容的DOM元素,并作为组件的this.domNode的值。在HTML模板中,除了可以使用基本的HTML元素和属性之外,还有一些附加的实用功能:在 HTML 模板中直接引用组件中的属性。比如组件中有个
12、属性叫title ,在 HTML模板中想引用该属性的值,可以直接写 $title。如果属性 title的值是 Hello,那么上述模板在运行时刻会变成Hello。通过 dojoAttachPoint来声明在组件对象中可见的DOM 节点。 当需要在组件中引用某个内部的DOM 节点时,不需要再次进行查询,通过dojoAttachPoint即可。如声明 ,就可以在组件对象中通过this.myNode来引用该SPAN 元素。通过 dojoAttachEvent来进行事件绑定。这种方式比先手工查询DOM 节点,再通过 dojo.connect来绑定要简单得多。如声明Test,就意味着将组件的test方法
13、绑定到按钮的onclick事件上。dijit._Templated的模板机制的这些实用功能减少了构建用户界面时的一些繁琐代码。作为容器如果组件是作为其它组件的容器来使用的话,就可以混入dijit._Container类。该类提供了对子组件的基本管理功能,包括查询、添加和删除等。使用该类的时候,需要在组件中声明一个containerNode的属性作为子组件的父节点。创建出Dijit组件之后,就可以通过 addChild方法来添加子组件了。销毁过程组件在创建并运行之后,就可能需要被销毁。销毁一个Dijit组件很简单,只需要调用destroyRecursive 方法即可。该方法会负责销毁当前 Dij
14、it 组件及其包含的子组件。当一个组件被销毁的时候,其 uninitialize 方法会被调用,类似于析构函数。因此可以把组件特有的销毁逻辑添加在uninitialize方法中。Dijit组件的接口与交互前面提到,组件之间通过设计好的接口和协议进行通讯。对于Dijit组件来说,它所提供的接口一般有下面这几类:公开的属性和方法。这些属性和方法类似于Java类中的公开的域和方法,在获取到组件对象之后可以直接使用。通过 dojo.connect进行连接。有些组件提供了一些占位符方法用来允许其使用者监听其内部状态的变化,类似于DOM 事件的处理。当组件之间进行通讯和协作的时候,一般有下面几种交互的模式
15、:传递组件对象的引用。这种做法一般是在创建新组件的时候,将其需要引用的组件对象传递进去,如 var anotherWidget = new MyWidget(parent :oneWidget, node);。不传递对象引用,而是进行查找。这种情况适用于所依赖的组件的ID已知的情况。可以通过dijit.byId来直接进行查找。使用 Dojo提供的全局通讯机制:dojo.publish和 dojo.subscribe过 dojo.publish来发布消息, 另外一个组件则通过dojo.subscribe。一个组件通来监听相关的消息并做出处理。一般来说, 比较推荐的做法是第一种,即通过传递组件对象
16、的引用来完成。不过当组件之间的关系比较复杂的时候,有可能需要将一个对象的引用进行多次传递。这个时候也可以考虑后两种做法。Dijit开发最佳实践编写 Dijit组件并不是一件复杂的事情,只需要按照一般的流程依次完成即可。不过Dijit组件本身的设计和实现比较复杂,包含了比较多的内容。下面对一些重点的地方进行讨论。编程式和声明式的创建方式选择这两种方式的区别只是在于开发人员的使用方式上。用声明式方式声明的Dijit组件,在运行时刻也是通过程序式的方式来进行创建的,由dojo.parser.parse方法来完成。因此,声明式的方式更像一种语法糖衣。不过声明式方式的一个好处是可以实现优雅地退化(gra
17、ceful degradation),即当 JavaScript不被支持的时候,仍然可以在页面上显示出部分内容。对于简单的和容器类的组件来说,声明式创建的方式比较好。简单的组件用声明式的方式比较简洁。 而容器类的组件在创建的时候一般都需要指定所包含的内容。使用声明式的时候,组件的子节点会自动作为容器类组件的子组件来添加。而如果以程序式的方式来完成的话,需要手工创建子组件,并通过addChild方法来逐个添加。代码会比较繁琐。组件状态变迁与外观样式在开发 Dijit组件中,经常会遇到的一个场景是根据组件内部的状态变化改变其外观样式。比如对于一个单选按钮组件来说,选中和未被选中的外观样式是不同的。典型的做法是通过切换不同的CSS样式名称来转换外观。比如未被选中适合的CSS样式名称可能是M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全面建筑材料采购合同样式
- 一次性购销合同的解除权条件
- 军事采购合同模板
- 科技服务合同的履行与监管
- 内墙涂装工程劳务分包合同
- 短途搬家装卸运输合同范本
- 2024楼宇电视广告合同
- 2024店铺店面装修合同范本
- 低温仓储与商品运输时效分析考核试卷
- 智能电子音箱的智能语音识别与播放考核试卷
- 人教版部编道德与法治九上1.2《走向共同富裕》说课稿
- 光伏行业发展报告2024-2025
- 好书读书分享名著导读《童年》
- 申请征地信息公开范文
- 物流园保安服务投标方案(技术方案)
- 《锂电池基本知识培训》课件
- 南京市红色旅游文化资源开发现状与对策研究
- 台球厅运营方案策划书(2篇)
- 高中地理大单元教学探索+全系统大单元整合
- 胸痛中心数据库培训
- 【试卷】五年级上册美术学科素养检测卷
评论
0/150
提交评论