【发布时间】:2013-11-27 17:43:25
【问题描述】:
我有一个自定义 dojo 小部件,我需要监听另一个 3rd 方小部件上的事件,然后将该事件与事件对象一起发送到另一个自定义小部件。出于某种原因,我的自定义小部件未发出事件,或者事件未正确注册到我的第二个自定义小部件。
这是我的第一个自定义小部件中与事件相关的代码:
onSelectComplete : function(evt) {
// this custom widget inherits from dojo/Evented. I've tried using this.emit and I've tried inheriting from _WidgetBase
on.emit(self, "select", evt);
},
startDrawing : function() {
//self._drawToolbar is the 3rd party widget from an API
self._drawToolbar.activate(Draw.POLYGON);
self._drawEndHandle = self._drawToolbar.on("draw-end", self.onSelectComplete);
},
这是我的第二个自定义小部件中的监听器:
on(self._selector, "select", function(evt) {
console.log(evt);
});
对于听众,我试过收听onSelectComplete、selectComplete、SelectComplete、selectcomplete、select-complete,但都没有奏效。我也尝试过使用aspect.after 而不是on,但这也没有用。我能够在调试时确定第一个自定义小部件的 onSelectComplete 被正确调用。
我被困住了……
【问题讨论】:
-
虽然猜测函数是自定义小部件声明的一部分,但使用
self表示法是错误的。当您的浏览器访问代码时,您的(全局?)变量self可能未定义或初始化为指向另一个对象。即。转换为this:) -
@mschr - 在我的构造函数中,我设置了变量
self = this。我这样做是因为,我也在我的应用程序中使用 jQuery,而 jQuery 不像 dojo 那样处理this。 -
您是在构造函数中使用
var self = this还是仅使用self = this?第二种情况是设置全局self,这是非常非常糟糕的主意!您提供的代码中不需要self。只需将self替换为this即可。 -
2Brian 我明白了,可以使用像 var self 这样的蒙面全局变量。只传递需要在名为 _self 的本地函数中链接的“this”,而不是为你解决问题:)
-
@Brian 您能否透露完整的 javascript 文件?也许在 jsfiddle.com 中?设置 jquery 版本并在其中创建一个永久链接并在此处编辑
标签: javascript events dojo widget