Dojo 1.6 官方教程翻译:创建基于模板的小部件(Widget)

dojo.js dojo核心文件,一款很好用的javascript库文件 dojo核心文件,一款很好用的javascript库文件 立即下载
创建 基于模板的小部件(Widget)

作者:Tom Trenka

原文链接:http://dojotoolkit.org/documentation/tutorials/1.6/templated/

译者:  feijia  (tiimfei@gmail.com)


在本教程中,你将学到Dijit 的重要组成部分模板系统:Dijit._Templated ,以及如何使用模板来快速创建自己的小部件

难度: 中等, 使用Dojo 版本: 1.6



Dijit (Dojo的小部件库)提供的_Widget 和_WidgetBase基类为开发小部件提供了完整的基础类,但是_Templated 基类的所引入的模板系统则使Dijit更显强大和灵活。

使用_Templated , 你可以快速的创建出易于维护,方便修改的小部件。

_Templated 的原理非常简单:它允许开发者创建一小段HTML片段,片段在运行时会被作为字符串加载(或者在build过程中直接内联入代码内)并被所有该小部件的实例所重用。

接下来我们将会解读_Templated 提供了哪些功能,并且动手开发一个使用_Templated 的小部件。

注意:_Templated 应当被当作混入代码使用(mixin), 而不是被直接继承。 用面向对象的观点来看,_Templated 更接近一个接口而不是一个类(虽然在JavaScript中,并没有办法明确区分二者)


_Templated 提供了哪些方法和属性


对使用_Templated 的程序员来说或,将_Templated 混入一个小部件将会给这个小部件的类带来下列的新属性:

templateString,         //  a string representing the HTML of the template
templatePath,           //  a URL pointing at a file to be used as a template
widgetsInTemplate       //  a Boolean indicating whether or not child widgets
                        //  are defined in the template



注意:templatePath 现在已经基本不使用了,只是为了向后兼容而保留。下面的章节中我们会展示如何搭配使用dojo.cache 和 templateString

这些新属性看起来如此简单,那么多强大的功能仅凭这几个属性就能实现么?真正的答案隐藏在_Templated向你的小部件定义中添加的其他内容。

_Templated覆写的方法


除了上述几个属性之外, _Templated覆写了Dijit Widget架构中的三个基础方法:buildRendering, destroyRendering, 和startup. 这三个方法分别负责:解析并填充模板(buildRendering),正确销毁Widget DOM树(destroyRendering), 并保障模板中包含的子Widget能够正确的被启动(startup)

注意:因为上述三个方法对于使用模板是必须的,如果你在自己的代码中也进一步覆写了这几个方法,请务必在你的覆写代码中加入this.inherited(arguments) 来调用父类的方法确保模板能正确处理。

使用_Templated


你只需要在创建Widget的类声明中的第二个参数数组中加入“dijit._Templated" ,就可以让你的Widget 支持模板. 例如,下面的代码就声明了一个支持模板的名为SomeWidget的Widget


dojo.declare("example.SomeWidget", [ dijit._Widget, dijit._Templated ], {
    templateString: dojo.cache("example", "templates/SomeWidget.html")
    //  your custom code goes here
});



Dijit 组件库中的组件都遵循在当前Javascript目录中创建一个单独的名为templates的目录来保存模板的编码习惯。 我们建议你也遵循同样的做法。


注意:在上述声明中,我们搭配使用了dojo.cache 和templateString 属性,dojo.cache方法会从其缓存或url中获取资源。这是最新版dojo中推荐的用来获取资源(例如这里的模板文件)的做法,它确保了使用尽量少的HTTP请求来获取资源.


现在我们已经有了可以支持模板的一个小部件的声明,接下来我们要为它写一个模板,并且解释模板可以包含哪些功能。



创建模板



一个模板就是一个HTML代码片段,你可以在其中定义DOM结构,也可以注入一些特殊的内容。 我们先从一个简单例子看起。

<div class="${baseClass}" data-dojo-attach-point="focusNode" data-dojo-attach-event="ondijitclick:_onClick" role="menuitem" tabindex="-1">
    <span data-dojo-attach-point="containerNode"></span>
</div>



在这个简单的模板里,演示了Dijit模板的3个重要功能:变量的替换,附着点(attach point), 以及DOM事件绑定.  接下来我们会依次解释这三个功能。

注意:每个模板的HTML中只能有一个根节点。 包含多个根节点的模板是非法的。

变量的替换:


模板中可以引用小部件中定义的变量的值。语法很简单

${property}

上述例子中,我们在模板的根节点的class属性里引用了变量baseClass的值(该变量适用于所有Widget). 如果该变量本身是一个对象的话,你还可以进一步引用该对象的属性值。 这时你需要在属性名前加上一个!

如:
${!propertyObject.property}

注意:从Dijit 1.5 开始,模板中使用变量值替换仅限用于哪些在小部件的整个生命周期中都不会变化的那些属性。如果你希望可以在声明周期中修改某属性值,我们建议你在postCreate方法中通过调用set方法来设置。



附着点(Attache Points)


Dijit 模板系统会在你定义的模板中寻找一个特殊的属性(称为attach point) - 使用了HTML5 的数据属性(data-*) 语法。一个连接点告诉模板渲染引擎: 如果模板中的某DOM节点上定义了data-dojo-attach-point 属性,则该节点的引用会被设置为在Widget中的对应属性。例如, 在上面例子中的SomeWidget的模板 定义了2个DOM节点。主节点(外层的div)可以在Widget代码中被引用为focusNode,而内层的span节点则可以通过Widget的containerNode属性来引用。


注意: 通常即使你在模板中不设置任何attach point ,模板的根节点可以在widget中通过domNode来引用。所以大多数时候你用不着显示的使用这个属性。


containerNode 容器节点


Dijit定义了一个特殊的附着点叫做”containerNode" . 从名字可以理解,containerNode就是一个容器节点,它为使用声明(declarative)方式创建的widget提供了放置额外标记片段的地方。例如:
<div data-dojo-type="example.SomeWidget">
    <p>This is arbitrary content!</p>
    <p>More arbitrary content!</p>
</div>



这个片段使用声明的方式创建了我们前面定义的SomeWidget的实例,在Dojo解释器解析这个段落时,它会实例化一个SomeWidget,而实例化的同时在这里被Div包含的HTML片段都会添加到SomeWidget所定义的容器节点中去。 所以当这个Widget被创建后,DOM树的结构会是:
<div class="someClass" role="menuitem" tabindex="-1">
    <span>
        <p>This is arbitrary content!</p>
        <p>More arbitrary content!</p>
    </span>
</div>




注意:上例中为了教程的简洁我们省去了一些自定义HTML5属性。


类似的,如果你在Widget声明中嵌入其他的Widget,那么子Widget也将被添加到你的容器节点中去(前提是你的Widget定义了一个容器节点) .  例如:
<div data-dojo-type="example.SomeWidget">
    <p>This is arbitrary content!</p>
    <div data-dojo-type="dijit.form.Button">My Button</div>
    <p>More arbitrary content!</p>
</div>



事件绑定


除了附着点,Dijit 模板系统还允许将原生DOM事件绑定到Widget的自定义方法上。这是通过另一个HTML5 自定义数据属性完成的:data-dojo-attach-event 。 该属性值是一组由逗号分割的键值对(键值间用冒号分开),键是原生DOM事件,值是要绑定此事件的Widget中的自定义方法。
例如:

data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick"



这个例子里我们定义的ondijitclick事件是一个Dijit自己定义的稍有改动onclick处理方法,在Dijit里通常可以使用onclick 的地方都可以是用ondijitclick 代替。

当Widget被实例化时,Diji模板系统会自动遍历所有的事件绑定属性,并使用connect 将这些事件和Widget中的方法绑定起来。当DOM事件被触发时,你的事件处理函数将能获得跟原生DOM事件同样多的参数,因此你可以完全的控制你的Widget.


查看示例

widgetsInTemplate 属性


最后,Dijit模板系统允许你使用widgetsInTemplate属性来通过模板创建组合控件。顾名思义,widgetsInTemplate 指明了你的模板中是否包含其他的Widget(默认值为false).

让我们对我们前面的例子稍作修改,来让它始终包含一个dijit.button

//  修改后的Widget定义
dojo.declare("example.SomeWidget", [ dijit._Widget, dijit._Templated ], {
    templateString: dojo.cache("example", "templates/SomeWidget.html"),
    widgetsInTemplate: true
    //  你的代码
});
 
//   模板定义
<div class="${baseClass}" data-dojo-attach-point="focusNode" data-dojo-attach-event="ondijitclick:_onClick" role="menuitem" tabindex="-1">
    <div data-dojo-type="dijit.form.Button" data-dojo-attach-point="buttonWidget">My Button</div>
    <span data-dojo-attach-point="containerNode"></span>
</div>



请注意在修改后的模板中,我们在dijit.form.Button的div节点上定义了一个连接点buttonWidget. 此后我们可以直接使用myWidget.buttonWidget来直接引用这个内嵌的button的widget (而不是仅仅引用这个DOM节点). 使用这种方法,你可以使用一些简单的widget来构建组合的widget,例如一个可以查看邮件列表的widget,或者是一个包含一系列按钮的工具条控件。

注意:使用widgetsInTemplate 时可能会有额外的开销,可能会影响你的widget的性能,甚至整个页面的性能。如果你不是非常清楚的了解这个属性的作用,最好还是将它设为false.


结论


在这篇教程中,我们学习了Dijit 强大的模板系统,使用混入 _Templated,以及你如何使用模板来快速构建自定义的Widget
. 我们还介绍了如何在模板中使用附着点,如何绑定DOM事件,以及如何构建包含其他widget的组合Widget的方法。



PSCAD通过python调用自动化库的实现 带有python脚本的pscad自动化PSCAD通过python调用自动化库的实现前期准备实现 PSCAD通过python调用自动化库的实现 在网上搜了一圈没有找到,通过油管的一个视频学到了,这里分享一下。 前期准备 下载PSCAD 在官方文档中建议PSCADV4.6.1及以上版本 下载python python这里没注明哪些版本可用,博主下载了最新的3.8.2使用正常。 下载IDE py... 阅读详情

相关推荐

GATK SNP过滤参数优化:从标准到个性化调整的实践指南

本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。

weixin_29216049的博客 275

data-dojo-attach-point

在 Dojo declaration 和 Dojo template 中,经常见到 dojoAttachPoint="xxx"这种语句,经过查文档,终于有了些理性的认识。举例说明如下: 如果想在 js 中修改 thead 、tr 时,就可以通过 dojoAttachPoint 指定的别名 head , headRow 来引用到 thead , tr ,从而可以操作它。更深层地理解,就是 thead

qq_15167261的博客 4110

【编号326】全国地灾数据全国25万多个地质灾害点空间分布数据

全国地质灾害点分布数据涵盖25万多个各类灾害点信息,为灾害防治提供重要依据。通过分析灾害分布规律,可识别高风险区,指导监测预警、应急避险和基础设施建设。多地成功案例(如湖北兴山崩塌避险、重庆长寿滑坡预警、湖南"挪床行动")证明,提前预警和科学防治能有效避免人员伤亡。云南省2024年通过预警体系成功避让31起灾害,保护1342人生命安全。这些实践表明,地质灾害防治需结合科技手段与群防体系,实现早预警、早处置。

千奇百怪无奇不有 1472

dojo引用html模板,Dojo学习-7:创建基于模板的小部件-Creating Template-based Widgets

原文:http://dojotoolkit.org/documentation/tutorials/1.10/templated/难度等级:中级 Dojo 版本:1.10起步如果你不了解用 Dijit 创建小部件 (widgets)的基础知识,请先学习:Dijit 的_WidgetBase为创建 widgets 打下一个良好的基础,但 Dijit 中真正神奇的是_TemplatedMixi...

weixin_29391349的博客 388

RcisTarget实战:从差异基因到转录因子调控网络的完整分析流程(附代码)

本文详细介绍了RcisTarget工具在转录因子调控网络分析中的完整流程,从差异基因到motif富集分析,再到结果可视化与生物学解读。通过实战代码演示,帮助研究者掌握这一强大的R包应用,揭示基因表达背后的调控机制,特别适用于基因组学和生物信息学研究。

weixin_29214199的博客 228

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1672

从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)

(73)封装一个widget 醒目:必须在web环境下使用,无论是python的web.py或者是通过http访问网站环境,都可以,但纯本地是不可行的。 首先,什么是widget? 简单来说,就是一个dom结点,比如像这样: <div> 这是一个dom结点 </div> 为什么需要widget呢? 很简单,比如,...

weixin_33730836的博客 401

unitree-G1外接 USB 麦克风完整配置指南

首先,将type-c麦克风插入G1机器人的USB口后,记录下USB麦克风的卡号(card)和设备号(device),通常显示为 card 1: Device [USB Audio Device]

m0_47999117的博客 599

Dojo学习笔记(二十一):创建自定义Dojo小部件

在这个教程中,我们将会演示如何利用Dojo 和Dijit框架来创建自定义的小部件,主要会使用到dijit/_WidgetBase and dijit/_TemplatedMixin。 Dojo的Dijit 库包含了丰富的界面小部件(Widgets),通过使用这些小部件,可以打造出强大的Web应用界面,从高级的表单元素,到复杂页面布局。...

weixin_34387284的博客 324

HMC7044调试指南与FPGA开发

最后,我们介绍了在FPGA开发中使用HMC7044的几个常见应用场景,包括时钟分配、时钟同步、高精度时钟生成和时钟域交叉。根据您的应用需求,您可以选择不同的时钟分配方案,例如使用PLL生成特定频率的时钟信号,或者通过分频器生成较低频率的时钟信号。HMC7044可以提供精确的时钟同步功能,确保各个FPGA板之间的时钟信号保持一致,从而实现可靠的数据传输和协同操作。HMC7044可以实现时钟域之间的交叉,通过生成和分配不同频率的时钟信号,使得不同时钟域的模块能够协同工作。FPGA开发中的HMC7044应用。

CqpFsharp的博客 3619

如何提高电路的抗干扰能力

本内容详细介绍了电源传导干扰处理,包括滤波、Feedthrough电容器、磁环、磁珠、屏蔽的使用与选型,EMC电磁兼容测试项目简介与要求,单片机与电源抗干扰处理等。

让你爱上电路设计 8600

“dojo”未定义_扩展Dojo dijits以创建自定义小部件

Dojo Toolkit是一个功能强大JavaScript™库,它使Web开发人员可以使用面向对象的小部件以最少的开发时间和精力来创建Rich Internet Applications。 它带有四个软件包,分别称为Dojo (核心), Dijit (UI框架), dojox (dojo扩展)和util 。 您可以按原样使用工具箱提供的功能,也可以扩展它们并创建自己的窗口小部件。 提供的功能包...

cuyi7076的博客 466

知识图谱大模型系列之 12 LLM 知识图谱构建器:从零到 GraphRAG 使用 LLM 知识图谱生成器在 GenAI 应用中提取和使用知识图谱(教程含源码)

为了更深入地了解 LLM 知识图谱构建器,GitHub 存储库提供了大量信息,包括源代码和文档。此外,我们的文档提供了详细的入门指南,而GenAI 生态系统则提供了有关可用更广泛工具和应用程序的进一步见解。

iCloudEnd的博客 2037

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

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

碎梦道 1805

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Dojo之Widget标签开发

Dojo widget就像是jsp中的自定义标签,通过学习开发widget标签来对其使用及其设计原理有更好的了解。本文主要是对Develop HTML widgets with Dojo一文的学习和翻译。 1. Dojo widget的概念 正如上所述,dojo widget就像是jsp中自定义标签,只是dojo widget是在客户端使用的(本文中统一简称dojo widge...

hck341204的专栏 512

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Dojo1.11官方教程文档翻译(5.9)创建自定义widget

在这篇教程中,我们将谈及如何利用Dojo碎片和Dijit框架来创建你的自定义widget,特别是如何使用`dijit/_WidgetBase`和`dijit/_TemplatedMixin`来快速并轻易地构建你的widget。

碎梦道 1126

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Dojo mobile TweetView 系列教程之一 —— dojox.mobile入门

Web技术飞速更新,而现在Web的趋势也是逐渐向移动设备上迁移。如同其他Web存在的问题一样,Dojo Toolkit已经为你提供了解决方案——dojox.mobile。dojox.mobile是一个由controllers、基于CSS3的主题以及一些外观与你的移动设备契合的wi

Dojo中文博客 1万+

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

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

碎梦道 615

Dojo mobile TweetView 系列教程之二 —— TweetView 启程

作者:David Walsh 翻译:Siqi (siqi.zhong@gmail.com ) 原文:Introduction to TweetView 在本系列的第一篇教程dojox.mobile入门 中,我们已经详细介绍了Dojo Toolkit中dojox.mobile包的基本概念和用法。在本系列接下来的教程中,我们将着手创建我们自己的强大dojox.mobile web应用...

jinghuainfo 104

flutter学习笔记

1.跨平台移动UI框架2.与现有的代码一起工作(可以直接嵌入到原生代码中或直接把原生代码嵌入到自己的代码中运行)3. 完全免费、开源。

haoxuhong的博客 8245
上一篇: Dojo mobile TweetView 系列教程之五 —— TweetView: Android,打包,回顾
下一篇: Dojo 1.6 官方教程: 理解Dijit Widget系统的基础架构
dojotoolkit
博客等级 码龄16年 1205粉丝 61原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值