Email:longsu2010 at yeah dot net
我对dojo组件的理解是dojo组件分为两类。
第一类是可以显示的,即小部件,他们都继承自`dijit/_WidgetBase`或者`dijit/_Widget`,当然dojo官方现在建议继承自前者。第二类是功能类组件,如dojo/aspect等等吧。
当然我们可以根据需要自定义这两类组件。
假如我们定义一个公共的表格组件供各项目使用,表格组件有一个排序功能,排序后需要做一些其他的操作,具体做什么不一定(因不同项目而定)。这类问题一般有两种实现方式,第一种是函数回调,第二种是事件发布及订阅。下面仅针对两种组件阐述事件发布和订阅这种实现方式该怎么做。
1、dojo小部件
dojo小部件均直接或者间接继承自`dijit/_WidgetBase`,而`dijit/_WidgetBase`基于`dojo\on`实现了on方法和emit方法。这下你就省事儿了,用on订阅事件,用emit发布事件就结了。
例如在表格中发布事件写法为
this.emit("aftersort",{/* args */});
在使用表格时订阅表格的事件为
grid.on("aftersort",function(args){
// do something
});
这里为什么没用驼峰标识法啊,答案是如果用的话可能会死的很惨。dojo这里有个bug,emit方法将事件名字做了toLowerCase,而on方法没做,也就是说发布名字为afterSort的事件,你订阅的时候要用aftersort才行,那还不如干脆全用小写。这里是陷阱,切记。2、功能组件
假如我们写一个异步获取数据的通用数据层,又假设通过websocket获取数据,这回可以推送数据了。该数据层负责的只是发送请求和接收数据,具体如何使用由各项目自己决定,这样的话数据层在有数据到达时候需要发布一个事件。如何实现?
继承自`dijit/_WidgetBase`显然不确当,dojo有一个模块为`dojo\Evented`,该模块实现了on和emit方法,可作为基类使用(第一基类或者mixin的基类)。
那也就是说我们继承自`dojo\Evented`就结了,而且这个on和emit可以使用驼峰标识法,但是为了风格统一还是全小写比较合适。
使用方法与dojo小部件的相同,不在此举例。写在后面:
如果你一定要使用驼峰表示法可以在定义自己的小部件时mixin `dojo\Evented`。