如何使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组件的理解是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`。
相关文章推荐
- 从零开始学_JavaScript_系列(九)——dojo(2)(AJAX、时间控件、鼠标事件、样式修改、事件移除、消息发布订阅)
- Dojo的事件发布和订阅机制
- Dojo安全通讯以及订阅发布事件
- 如何利用callback机制开发基于WCF的事件发布/订阅系统
- 《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:发布具有同步能力的FeatureService服务
- 【Emit基础】IL中发布、订阅、触发事件
- unity开发之八:如何在UGUI其他的组件上添加点击事件(解答)
- DevExpress的NavBarControl组件中NavBarGroup如何触发展开或者折叠事件(点击事件)?
- Eventbus的使用与深入-- 一个好用的开源的事件订阅与发布总线,解放你的handler
- 【Emit基础】IL中发布、订阅、触发事件
- WCF 4.0 进阶系列 – 第十六章 使用回调合约发布和订阅事件(第二部分)
- ====如何让HyperLink控件具有OnClick事件?====
- StackExchange.Redis官方文档(六)【事件,发布订阅,服务器命令】
- 事件发布/订阅轻量级框架EVENTBUS
- WCF 4.0 进阶系列 – 第十六章 使用回调合约发布和订阅事件(第一部分)
- sqlserver同步2 如何让订阅服务器与发布服务器库结构一样
- 如何使得一个JComponent组件不论是否获得焦点,都可以响应键盘事件
- sencha touch2 中 如何在控制层中给组件panel注册tap事件
- 发布 / 订阅的事件总线(eventBus)
- 发布订阅 - 基于A2DFramework的事件机制实现