您的位置:首页 > 其它

如何使dojo组件具有发布和订阅事件的能力

2013-05-03 10:15 274 查看
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`。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dojo emit on
相关文章推荐