Dojo 1.6 官方教程: 理解Dijit Widget系统的基础架构

认识Dojo中的界面控件:Dijit <br />Dojo框架区别于其他Ajax框架的一个显著特征就是它的界面控件系统:Dijit。Dijit是Dojo中界面控件的总称,他们使用灵活而且易于理解。每个Dijit控件都是由Dojo类以及控件中使用的图片,CSS等资源文件共同组成。通过Dijit架构,可以方便的创建灵活、可扩展、可定制外观的控件。下面将逐步介绍如何创建、配置Dijit控件,从而将其用在自己的web应用中。<br /><br /> 开始使用Dijit:引入需要的类和资源<br /> <br />前面提到Dijit的组成中除了Dojo类 阅读详情

作者: Tom Trenka
原文链接: http://dojotoolkit.org/documentation/tutorials/1.6/understanding_widget/
译者: feijia (tiimfei@gmail.com)


本教程中,你将会学到Dijit中的_Widget和_WidgetBase这两个重要的基类对象,理解它们作为所有Dojo小部件的基类的作用和功能。


难度:中等
适用Dojo版本: 1.6

创建Dijit (dojo的小部件库) 和自定义小部件的基础,是由两个基类构成的: dijit._widgetBase和 dijit._Widget. 当然Dijit系统还包含其他一些重要的工具例如Dojo的解析器,和 Dijit模板系统. 在这个教程里,你将会学到Dijit的基础架构是如何运作的。理解了这些,使用和创建Dijit会变的更加容易。

注意:dijit._Widget 继承自 dijit._WidgetBase; 如果你需要创建自定义的小部件,那么你应当继承 dijit._Widget 而不是dijit._WidgetBase, (当然你也可以直接继承其他Dijit中现有的小部件)

也许你已经注意到了,这两个基类前面都有一个下划线“_" ,这实际上是Dojo中对内部类的一种命名规范。表示这个类不应被用户直接使用,而是作为基类被继承的。

学习Dijit 库,最关键的是要能理解每个小部件的生命周期:从这个小部件被创建,到它能被程序使用,再到最终它被销毁(生命周期也包含了创建与销毁这个小部件所对应的页面中的DOM元素)


Dijit的生命周期


每个继承自dijit._Widget的小部件在实例化时都会经历下面的方法调用过程:
([widget].constructor());
[widget].postscript();
[widget].create();
[widget].postMixinProperties();
[widget].buildRendering();
[widget].postCreate();  // 这个方法对开发者而言是最重要的
[widget].startup();

查看示例

从这些方法的名字我们大概可以猜测出它们的作用:

1. 何时初始化参数
2. 创建对应这些参数的图形,DOM元素
3. 确定放置这些元素的位置,
4. 如何处理浏览器相关的一些问题(例如 DOM node measurements)

[widget].postCreate()

对于小部件的开发者来说,postCreate()可能是最重要的一个方法了。
这个方法会在小部件的所有属性参数设置好,小部件所使用的DOM树节点被创建完成后调用。而此时该小部件的DOM节点还没有被添加到主文档中去。因此这个方法是在小部件被呈现给终端用户之前,开发者可以做最多定制的地方。(例如设定许多自定义参数和属性). 这就好像是一出戏的大幕拉开之前,你可以做的最后准备工作的环节. 在开发自定义小部件时,绝大多数定制的属性和行为都会在这里被加入.

[widget].startup()

在Dijit一系列生命周期中,另一个重要方法是启动方法startup. 这个方法会在DOM节点被创建并添加到网页之后执行,同时在这个方法也会等待当前小部件中所包含的子控件被创建并正确启动之后才执行。

注意: 当你用编程的方法创建一个小部件时,记得一定要调用它的startup()方法。很多开发者常犯的错误就是仅仅创建了小部件对象却忘记调用startup(),结果就会导致小部件在页面上无法正确显示。

析构和销毁方法


除了创建和启动,dijit._WidgetBase 还定义了一系列用于析构和销毁的方法:

[widget].destroy();
[widget].destroyDescendants();
[widget].destroyRecursive();
[widget].destroyRendering();
[widget].uninitialize();

在开发自定义小部件时,你需要覆写[widget].uninitialize 方法,在其中释放你所使用的资源.  Dijit框架会自动的负责销毁该Widget所使用的DOM节点,以及大部分的对象.

引用小部件的DOM节点


通常来说, Dijit小部件都是一些界面元素,因此多数会包含一些DOM节点。 Dijit._WidgetBase中定义了一个属性domNode ,该属性会指向该小部件中所使用的DOM根节点. 当该小部件的postCreate方法执行后,domNode属性就可以使用了。通过使用这个属性,你可以获取并操纵根节点,例如你可以把这个小部件整体移动到DOM树中的另一个位置上。

除了domNode属性外,有些小部件还会定义一个containerNode属性. 这个属性指定了小部件DOM中的一个容器节点,用来包含子控件。( 参看另一篇Dijit模板教程)

Getters和Setters


_WidgetBase 作为基类,除了提供了一些通用的标准属性,它还定义了一套标准的getter和setter方法来访问开发者自定义属性。这套标准要求你定义一些私有方法(JavaScript中并没有真正的私有方法,Dojo遵循的一种编码规范是使用下划线开头的方法名表示类的私有方法)
// 例如你的小部件中需要对外暴露一个"foo"属性, 则需要定义下列两个私有方法
 
//  custom getter
_getFooAttr: function(){ /* do something */ },
 
//  custom setter
_setFooAttr: function(value){ /* do something */ }



一旦你定义了上述两个方法,用户就可以使用dijit框架的标准get和set方法来访问你的自定义属性. 例如在定义了上述两个私有方法后,现在用户可以直接使用get和set来访问foo属性。

//  假设这个小部件的实例是"myWidget"
 
//  get the value of "foo":
var value = myWidget.get("foo");
 
//  set the value of "foo":
myWidget.set("foo", someValue);




通过定义Dijit标准的getter和setter方法,不仅规范了编码风格,更重要的是它增加了灵活性。你可以在这些getter和setter方法中加入自定义的其他动作,例如当一个属性被访问时,你可以对DOM节点做相应的修改,或者是发出某些事件的通知信息. 看下面的例子:

//  假设我们需要在Value属性发生变化时触发onChange
 
_setValueAttr: function(value){
    this.onChange(this.value, value);
    //注意这里使用了Dijit标准的_set方法
    this._set("value", value);
},
 
//  a function designed to work with dojo.connect
onChange: function(oldValue, newValue){ }



注意: 在开发小部件时,请务必使用上述的标准getter和setter方法来访问存取自定义属性。另外在实现私有的setter方法时,也务必要使用_set方法。 这是因为通过使用该方法Dijit控件就可以使用Dojo.Stateful中的watch方法。



在Dijit中使用事件和消息订阅

_WidgetBase还定义了connect和subscribe方法。它们也遵循Dojo中通用的事件和消息订阅机制。因此所有的Dijit小部件都自动了拥有了对事件处理能力:

// 假设我们有一个dijit.Button小部件btn
//  我们希望这个button能够监听foo.bar():
 
btn.connect(foo, "bar", function(){
    //  注意这个回调函数的执行上下文是在btn对象中!
    this.set("something", somethingFromFoo);
});


Dijit的主题消息订阅也是类似的。

通过在_WidgetBase中定义connect和subscribe方法,所有的Dijit小部件都有了事件处理功能;另外通过_WidgetBase中定义的connect和subscribe方法,所有的订阅和连接都会被自动记录,因此在小部件销毁时也可以自动的释放和退订相应事件,从而避免了潜在的内存泄露问题。

Dijit预定义的属性和事件


最后我们来看看_Widget 预定义了哪些属性。

id,         //  唯一标记该小部件实例的标识符
lang,       //  该小部件所使用的语言标记,可以覆盖Dojo全局的语言设定。
dir,        //  双向语言支持的标记(值可以为rtl或者ltr)用来支持阿拉伯语等从右向左显示的语言
class,      //  domNode(小部件根节点)的HTML class属性
style,      //  domNode(小部件根节点)的HTML style 属性
title,      //  HTML title 属性
tooltip,    //  可选的指向 dijit.Tooltip 的引用
baseClass,  //  小部件的根级别的css类名
srcNodeRef  //  在被转换为小部件前的原始DOM节点


然后我们也一起了解一下哪些事件是dijit所支持的,(你可以连接到这些事件,也可以覆写这些事件)
//  鼠标事件
onClick,
onDblClick,
onMouseMove,
onMouseDown,
onMouseOut,
onMouseOver,
onMouseLeave,
onMouseEnter,
onMouseUp,
 
//  键盘事件
onKeyDown,
onKeyPress,
onKeyUp,
 
//  其他事件
onFocus,
onBlur,
onShow,
onHide,
onClose


 

总结


本文介绍了Dijit的 _widget 和_WidgetBase 中所提供了基础架构方法和属性,这些共同构成了Dijit框架: 生命周期,DOM'节点引用,自定义属性存取方法getter和setter以及预定义的属性和事件.  有了这些坚实的基础架构,开发一个自己的Dijit小部件也变得很简单。

参考


创建一个自定义小部件

创建基于模板的小部件

dijit._Widget 文档(dojo参考手册 )
Dojo 小部件开发演示 dojo dijit 小部件开发,将两个 Button 和一个 FilteringSelect 进行组合构成一个新的部件,便于开发部署,减少代码量. 立即下载

相关推荐

DOJO API 中文参考手册,附加注解实例(精心重新排版DOC文档)

Dojo 1.1.1 提供了上百个包,这些包分别放入三个一级命名空间:Dojo,Dijit和 DojoX 。其中 Dojo 是核心功能包 , Dijit 中存放的是 Dojo 所有的Widget 组件,而 DojoX 则是一些扩展或试验功能,DojoX 中的试验功能在成熟之后有可能在后续版本中移入到 Dojo 或 Dijit 命名空间中。列举了常用的一些包及其功能,以方便读者有个初步了解或供以后查阅

突破视频生成瓶颈:Mora多智能体框架如何重塑AI视频创作

在视频生成技术快速发展的今天,许多开发者面临着一个共同的技术挑战:如何让AI理解复杂的视频创作需求,并生成高质量、连贯的动态内容?传统的单模型方法往往在视频一致性、场景转换和创意实现方面存在局限。开源项目Mora应运而生,它通过创新的多智能体协作架构,为这一技术瓶颈提供了全新的解决方案。 Mora是一个开源的多智能体视频生成框架,旨在模拟并扩展OpenAI Sora的能力。它通过多个专业智能体的

gitblog_00080的博客 565

dojo新手快速入门教程-首发高清PDF中文版

dojo新手快速入门教程-高清PDF中文版

Dojo widget 系统 - dijit._WidgetBase类(1)

Dojo 里所有的小部件(Widget)都会直接或间接的继承 dijit._Widget / dijit._WidgetBase dijit._Widget 是 dojo 1.6 和 1.6之前的版本的基类, 在 dojo 1.7 之后的版本, 官方建议直接继承 dijit._WidgetBase 类(继承 dijit._Widget 也可以, dijit._Widget 继承了 dijit._

Patrick's 专栏 3810

dojo中文文档-dojo手册

dojo中文文档下载。dojo中文文档下载。

NTFS分区变成RAW别乱修!正确数据恢复与修复方法详解

文件系统是操作系统管理存储数据的核心机制,NTFS作为Windows主流文件系统,一旦分区识别异常,常会显示为RAW格式。分区变RAW通常意味着文件系统入口信息损坏,而非数据物理消失,但若采用错误的修复方式,如直接对RAW分区执行chkdsk /f,可能因系统无法正确识别文件系统结构,导致写入操作落在错误偏移位置,二次破坏本可恢复的数据。正确的处理思路是:先停止一切写入操作,通过扇区级镜像备份保留原始现场,再分析DBR、分区表及$MFT状态,依据诊断结果选择修复或深度扫描恢复。实际排查中,常见问题如DBR记

weixin_31155097的博客 134

DOJO API 中文参考手册

DOJO API 中文参考手册 Dojo 体系架构总体上来看是一个分层的体系架构。最下面的一层是包系统,Dojo API 的结构与 Java 很类似,它把所有的 API 分成不同的包(package),当您要使用某个 API 时,只需导入这个 API 所在的包。包系统上面一层是语言库,这个语言库里包含一些语言工具 API,类似于 Java的 util 包。再上一层是环境相关包,这个包的功能是处理跨...

dev_mlzhang的博客 2万+

APM水下机器人实战:从零搭建高精度自主航行系统

本文详细介绍了如何基于开源APM飞控及其水下分支ArduSub,从零搭建高精度自主水下航行器。核心在于集成双天线RTK模块实现厘米级定位与精确航向,并配合MAVROS与ROS构建自主控制系统。文章涵盖了硬件选型、软件配置、自主逻辑开发及水池调试的全流程实战经验,为水下机器人爱好者与研究者提供了一套完整的自主航行系统解决方案。

app77的博客 512

Dojo,Dijit基本内容总结

dojo.declare dojo.declare在dojo中被广泛使用,理解它将对弄懂dojo的代码有很大帮助。简单的说,dojo.declare提供了一种声明类的方式,通过它可以很方便的扩展其他类: dojo.declare("com.abc.MyDataProvider", dojo.widget.ComboBoxDataProvider, { name: "My Da

笨得很想飞的专栏 1449

J204B接口数据链路的建立

介绍J204B数据链路层的建立方式

QUACK_G的博客 6548

RealSense D455的标定并运行VINS-FUSION

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_40186909的博客 2万+

Dojo1.11官方教程文档翻译(5.8)创建基于模板的widget

这篇教程你将了解Dijit的`_TemplateMixin`混合的重要性,以及如何使用模板快速创建自定义widget。

碎梦道 1805

三相逆变器LCL滤波设计实战:从αβ转换到dq解耦控制的完整建模流程

本文详细解析了三相逆变器LCL滤波设计中的关键步骤,从αβ转换到dq解耦控制的完整建模流程。重点介绍了dq坐标系下的解耦控制策略,通过Simulink仿真验证模型准确性,并提供谐振峰偏移、解耦不彻底等实际问题的解决方案,助力电力电子工程师提升系统稳定性。

weixin_28678151的博客 229

掌握Dojo工具包,第1部分:Dojo入门简介(2)

常用包介绍Dojo 1.1.1 提供了上百个包,这些包分别放入三个一级命名空间:Dojo,Dijit 和 DojoX 。其中 Dojo 是核心功能包 , Dijit 中存放的是 Dojo 所有的 Widget 组件,而 DojoX 则是一些扩展或试验功能,DojoX 中的试验功能在成熟之后有可能在后续版本中移入到 Dojo 或 Dijit 命名空间中。由于 Dojo 包种类繁多,下面只列举了最常用的一些包及其功能,以方便读者有个初步了解或供以后查阅。包名 功能 dojo.io 不同的 IO 传输方式。 sc

A Blog Just For Qiailin 1184

系统设计---算法与架构

这片文章对系统设计的具体步骤及相关知识进行介绍,主要分为四部分:算法设计、IC系统架构设计、基于systemC的IC系统设计、系统设计工具SPW简介。 (一)算法设计 系统设计的第一步是给出清晰的系统规范,该规范写明了系统的功能、性能、费用、开发时间等。接下来创建一个系统行为模型,并且可以用来初步验证设计的性能。再下来,对行为模型进行细化,即进行算法设计。算法设计大致分为三步: 1)给出浮点

正在努力的ICer的博客 4373

概念解析 | 事件相机的原理 (含仿真代码)

在我们熟悉的世界里,传统相机就像一个勤勉的绘画师,每隔固定的时间就为我们勾勒出一幅完整的画面。但是,大自然中有太多瞬息万变的精彩场景,这种"定时绘画"的方式往往难以捕捉。于是,一种全新的"观察者"应运而生 -事件相机(Event Camera)。事件相机,就像是一群极其敏感的"像素哨兵",它们不再按部就班地等待指令,而是主动感知周围的变化,只有在光线强度发生显著变化时才会发出信号。这种革命性的设计,让事件相机拥有了传统相机难以企及的优势:超高的时间分辨率、极低的延迟、宽广的动态范围,以及出色的能效比。

NLOS的博客 1422

dojo入门(1)

常用包介绍Dojo 1.1.1 提供了上百个包,这些包分别放入三个一级命名空间:Dojo,Dijit 和 DojoX 。其中 Dojo 是核心功能包 , Dijit 中存放的是 Dojo 所有的 Widget 组件,而 DojoX 则是一些扩展或试验功能,DojoX 中的试验功能在成熟之后有可能在后续版本中移入到 Dojo 或 Dijit 命名空间中。由于 Dojo 包种类繁多,下面只列举

一室阳光,温暖你我他! 1131

模型预测控制(MPC)解析(三):多输入多输出系统

本文为阅读笔记,仅供学习交流使用!!! 在之前的文章中,为了简单起见,以单输入单输出系统为例介绍了MPC控制的实现方法。因为使用的是状态空间方程作为系统模型,这种方法可以轻松的扩展到多输入多输出系统中。 ...

行者无疆的博客 1万+

Dojo Widget 中DOM事件的初始化和销毁

这篇帖子还是属于Dojo Widget系列吧。从上一篇dijit.layout.ContentPane 中的标准方法/事件在不同情况下的调用中,我们看到了dijit.layout.ContentPane 中的标准方法/事件在不同情况下是如何被调用的,这儿就可以基于其结论探讨一下,

沧海一粟 —— 技术随手记 5866

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Dojo1.11官方教程文档翻译(5.7)理解 _WidgetBase

在这篇教程中你将了解Dijit的`_WidgetBase`模块,以及它如何成为Dojo工具集所有widget的基础。

碎梦道 615

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

dojo学习

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33790053的博客 78

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

掌握 Dojo 工具包,第 1 部分: Dojo 入门简介

随着富互联网应用程序(Rich Internet Application,RIA)的发展,一批 JavaScript Toolkit 也随之兴起 , Dojo 便是其中的优秀代表,本系列文章 将由浅入深带领读者走进 Dojo 的世界。本文作为这个系列的开篇 , 主要讲述了 Dojo 的体系架构以及如何安装使用。 伴随 Web 2.0, Ajax 和 RIA 的热潮,各种 Ajax...

weixin_30907935的博客 82
上一篇: Dojo 1.6 官方教程翻译:创建基于模板的小部件(Widget)
下一篇: Dojo 1.6 官方教程: DataGrid导引
dojotoolkit
博客等级 码龄16年 1205粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值