如何使dojo组件具有发布和订阅事件的能力
Email:longsu2010 at yeah dot net 我对dojo组件的理解是dojo组件分为两类。 第一类是可以显示的,即小部件,他们都继承自`dijit/_WidgetBase`或者`dijit/_Widget`,当然dojo官方现在建议继承自前者。第二类是功能类组件,如dojo/aspect等等吧。
当然我们可以根据需要自定义这两类组件。 假如我们定义一个公共的表格组件供各项目使用,表格组件有一个排序功能,排序后需要做一些其他的操作,具体做什么不一定(因不同项目而定)。这类问题一般有两种实现方式,第一种是函数回调,第二种是事件发布及订阅。下面仅针对两种组件阐述事件发布和订阅这种实现方式该怎么做。
1、dojo小部件 dojo小部件均直接或者间接继承自`dijit/_WidgetBase`,而`dijit/_WidgetBase`基于`dojoon`实现了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有一个模块为`dojoEvented`,该模块实现了on和emit方法,可作为基类使用(第一基类或者mixin的基类)。 那也就是说我们继承自`dojoEvented`就结了,而且这个on和emit可以使用驼峰标识法,但是为了风格统一还是全小写比较合适。 使用方法与dojo小部件的相同,不在此举例。写在后面: 如果你一定要使用驼峰表示法可以在定义自己的小部件时mixin `dojoEvented`。(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |