Dojo之Widget标签开发
Dojo widget就像是jsp中的自定义标签,通过学习开发widget标签来对其使用及其设计原理有更好的了解。本文主要是对Develop HTML widgets with Dojo一文的学习和翻译。由于本人水平有限,如有不妥或者不对之处轻各位大虾批评指正
1. Dojo widget的概念
正如上所述,dojo widget就像是jsp中自定义标签,只是dojo widget是在客户端使用的(本文中统一简称dojo widget为widget标签)。Widget标签已经脱离了传统的DOM模型结构,每个Widget标签都有唯一的widgetID,并且可以包含多个属性,而且可以包含子Widget标签。Widget共包含三个部分:
l 一个包含Widget标签逻辑的js文件,通过JavaScript DOM模型来处理可见的元素。
l HTML模板文件,它提供基本的Widget HTML视图。当然如果模板很简单,完全可以在js文件中用字符类型替代。
l Css样式文件,定义标签的样式,在js代码或者HTML模板文件中使用。
l 图片文件。
目录结构如下:
dojo/src/widget ------------------------------------ js代码文件
dojo/src/widget/templates ------------------------ HTML模板,Css样式文件
dojo/src/widget/templates/images --------------- 图片文件
2. Widget标签的使用
使用标准的Dojo Widget标签创建Button按钮,代码如下:
<html> <head> <script type="text/javascript" src="js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.Button"); </script> </head> <body> <div dojoType="Button">Submit</div> <!--另一种使用Widget标签的方法--> <!--<dojo:button caption="Submit"></dojo:button>--> </body> </html> |
执行效果如图:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype>
3. 自定义 Widget 标签 -HelloWorld
首先创建js/dojo/src/Widget/templates/HelloWorldTemplate.html,代码如下:
<div> HelloWorld </div> |
创建js/dojo/src/Widget/HelloWorl.js,代码如下:
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templatePath:dojo.uri.dojoUri("src/widget/templates/HelloWorldTemplate.html") } ); |
注:所有用户自定义Widget标签都必须继承HtmlWidget。
创建测试文件HelloWorld.html,代码如下:
<html> <head> <script type="text/javascript" src="js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.*"); dojo.require("dojo.widget.HelloWorld"); </script> </head> <title>Hello World Widget test</title> <body>
<div dojoType="HelloWorld"></div> <dojo:HelloWorld></dojo:button> </body> </html> |
如果HelloWorldTemplate模板足够简单,可以使用templateString替换templatePath,修改后HelloWorld.js代码如下:
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templateString: "<div>Hello World</div>" } ); |
4. 自定义Widget标签属性
以上部分讨论了如何创建简单的自定义标签,下面需要给HelloWorld添加属性以及自样式,让其更像一个标准的Html标签。让HelloWorld标签的显示内容可以有用户定义,添加text属性就可以办到。修改后的代码如下:
HelloWorld.js
dojo.provide("dojo.widget.HelloWorld"); dojo.require("dojo.widget.HtmlWidget"); dojo.widget.defineWidget("dojo.widget.HelloWorld", dojo.widget.HtmlWidget, { templateString: "<div>${this.text}</div>", text: ""//default value } ); |
注:自定义属性必须要设置默认值,否则会被Dojo忽略。而且Dojo会忽略DOM模型下的所有属性。
HelloWorld.html
<html> <head> <script type="text/javascript" src="js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojo.widget.*"); dojo.require("dojo.widget.HelloWorld"); </script> </head> <title>Hello World Widget test</title> <body>
<div dojoType="HelloWorld" text="you can set the text attribute"></div> <!--<dojo:HelloWorld text="you can set the text attribute"></dojo:button>--> </body> </html> |
属性的处理
处理属性的典型方法是postCreate()方法(稍候讨论),另一个方法是fillInTemplate()。许多Widget标签都是通过postCreate()方法来处理属性的,也有通过set方法。不同的是postCreate()方法是在标签创建时处理属性,而set方法是在运行时动态设置属性。
脚本片断
在HEML模板文件中加入js代码并不是一个好的方法,但有时候却必不可少。在Dojo中可以使用${…}代码片断来获取属性值,正如上例中的${this.text}。
添加样式
为了使Widget达到真正的功用,Dojo提供了定制css样式的功能,通过引用不同的自定义样式,可以方便的为应用改变显示效果。为HelloWorld标签添加样式,创建一个简单样式文件js/dojo/src/widget/templates/HtmlHelloWorld.css,代码如下:
.caption { font-family: Verdana; font-size: <chmetcnv w:st="on" unitname="pt" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0"><span style="COLOR: blue">10pt</span></chmetcnv>; } |