您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 广元分类信息网,免费分类信息发布

麻雀虽小五脏俱全 Dojo自定义控件应用_dojo

2024/4/9 2:57:07发布5次查看
现在javascript框架、控件库有很多,jquery、ext、prototype、mootools、dojo等等,这些都是在google上搜索“javascript+framework”列在第一页的。其中,除了mootools,其它的都有所了解,但只在项目中用过ext和dojo。但一直不太喜欢ext,性能有问题,新的版本还收费了。
另外,ext官方提供的例子都是用javascript来创建和初始化控件,一个javascript配套一个html来用,这样管理起来很混乱。而且官方例子是best practice,所以不太接受这种模式。dojo在本人眼里是一个缺点和优点都很突出的家伙:
缺点:
1、文档非常之差;
2、codebase非常之大(优点乎,缺点乎?);
3、版本演进快,且每次版本演进,都有大量的api发生变化,还不够成熟。
优点:
1、是一个很优秀的控件开发框架;
2、完全体现了javascript面向对象的一面。
ext和dojo比起来,本人觉得ext是一个控件库,而dojo是一个框架。第一次接触dojo,当时版本0.3.x,今天项目中又有需求想用dojo,版本是1.3.1,对比0.3和1.3,发现核心的思路并没有太大变化,但出厂提供的控件却有翻天覆地的变化,不过已经先入为主的对它的控件有成见,导致现在也没有兴趣再去研究,还是讲讲如何拿dojo做自定义的控件吧。dojo很复杂,但我们可以简单的认为它分三层:
1、最底层的是核心api
核心api提供的方法简化了dom、字符串、css、事件等相关的操作。核心api还实现了类似于java的package概念和import机制,方便了代码组织和依赖管理。
2、基于核心api,创造了“控件生命周期”概念
这是dojo的亮点,允许第三方以规范的方式开发控件。基于dojo开发的控件具有很强的内聚性和面向对象的特性。
3、基于2所开发的各类控件
dojo自己提供的控件也比较全了,只是由于历史原因,没有深入研究过。
dojo的控件统称dijit,要写出dojo版的hello world控件,你需要了解的知识并不太多:
◆一个控件就是一个js类;
◆所有的控件都继承自_widget或其子类,_widget类提供了控件的生命周期管理函数;
◆可以同时继承_templated,继承该类,可以为控件绑定模板来描述控件的展示。
关于_widget基类的介绍
1、生命周期方法
_widget提供了一系列方法称为“生命周期方法”,dojo框架在初始化一个控件的时候,会依次调用它们,我们的自定义控件,可以重写特定的方法来加入自己的初始化逻辑,方法调用顺序及说明:
复制代码 代码如下:
preamble(/*object*/ params, /*domnode*/node)
//这是一个通常不会用到的方法,这个方法的返回值,作为constructor的输入参数param
constructor(/*object*/ params, /*domnode*/node)
// 这个方法相当于java类的构造函数
// 在这个类中执行初始化动作
postscript(/*object*/ params, /*domnode*/node)
//实际的控件创建过程,依次调用如下方法(都可以被重写)
_widget.create(/*object*/params, /*domnode*/node)
_widget.postmixinproperties( )
_widget.buildrendering( )
_widget.postcreate( )
//我用得最多的是postcreate方法,这个方法中,控件已经初始化完毕,界面上也已经显示出来了,
//通常在这个方法中启动业务相关的处理
2、该类的几个重要属性(控件可以通过this访问)
◆id:控件被授予的唯一编号,如果用户不指定,则dojo随机创建一个。
◆domnode:该控件在html中对应的dom节点。
最基本的自定义控件示例:
js文件:./hello/world.js(以下涉及到文件名,都用相对路径,其中./代表和dojo,dijit,dojox同级目录)。
复制代码 代码如下:
//声明自己输出的类名
dojo.provide(hello.world);
//声明自己依赖的类名dojo.require(dijit._widget);
dojo.require(dijit._templated);
//dojo.declare定义控件类,第一个参数:类名,第二个参数:父类数组,第三个参数:类的prototype
dojo.declare(hello.world,[dijit._widget,dijit._templated],
{
postcreate:function(){
this.domnode.innerhtml=hellow world;
}
}
);
该控件的行为极其简单,在postcreate方法中,将自己在html页面中对应的dom节点的内容设置为hellow world。
复制代码 代码如下:
hello world
modulepaths的具体作用和用法,请google即可。接下来,我们将控件参数化,我们可以在写标签的时候,将名字作为参数传进去,然后控件显示hello xxx,首先将html文件改成:
复制代码 代码如下:
hello world
大家注意到,我们在标签上增加了“yourname”属性,在控件中如何使用该属性呢?可以在construtctor方法中接收此属性的值,将值赋给控件类自身的变量,然后在postcreate中使用,javascript代码如下:
复制代码 代码如下:
dojo.provide(hello.world);
dojo.require(dijit._widget);
dojo.require(dijit._templated);
dojo.declare(hello.world,[dijit._widget,dijit._templated],
{ yourname:'world',
constructor:function(params,node)
{
this.yourname=params.yourname;
},
postcreate:function()
{
this.domnode.innerhtml=hellow +this.yourname;
}
}
);
接下来,我们将进一步增加控件进的复杂性,增加一个输入框,在这个输入框中输入文本的同时,动态更新hello xxx,这就要用到dojo的事件绑定机制,最常用的模式为:dojo.connect(node,event,obj,method);表示将obj的method方法作为domnode的event事件处理函数,例如:
复制代码 代码如下:
dojo.connect(inputtext,onkey,this,updatehello);
这次先改控件,在postcreate的时候,动态增加一个输入框,并为输入框动态绑定事件:
复制代码 代码如下:
dojo.provide(hello.world);
dojo.require(dijit._widget);
dojo.require(dijit._templated);
dojo.declare(hello.world,[dijit._widget,dijit._templated],
{ yourname:'world',
typein:null,
echodiv:null,
constructor:function(params,node)
{ this.yourname=params.yourname;
},
postcreate:function(){
this.typein=document.createelement(input);
this.typein.type=text;
this.domnode.appendchild(this.typein);
this.echodiv=document.createelement(div);
this.domnode.appendchild(this.echodiv);
dojo.connect(this.typein,onkeyup,this,updatehello);//动态绑定事件
this.updatehello();//调用方法初始化一下,先显示一个空的hello
} ,
updatehello:function()
{
this.echodiv.innerhtml=hello +this.typein.value;
}
}
);
而html文件中对控件的引用,不用做任何改变(严格来讲,你需要删除yourname=jinxfei这个属性)。从这个稍微有一点点复杂的控件,我们已经可以看出dojo的优势:真正的面向对象!控件管理范畴内的dom元素,都可以放在类中作为属性来使用(直接用this.xxx引用),这样,避免了document.getelementbyid()满天飞,控件是内聚的。响应事件的方法也是类的方法,免得在页面中声明大量的离散function,不好管理。
广元分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录