dojo 小部件不会发出事件
Posted
技术标签:
【中文标题】dojo 小部件不会发出事件【英文标题】:dojo widget won't emit event 【发布时间】: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 版本并在其中创建一个永久链接并在此处编辑
【参考方案1】:
对不起,我没有早点提供答案,但我确实找到了解决方案。
我没有让我的 dojo 模块继承自 dojo/Evented
,而是让它继承自 dijit/_WidgetBase
。通过这样做,我的自定义 dojo 模块/小部件现在实现了 on
函数。
所以在我的第一个小部件中,我有一个名为 onSelectComplete : function (evt)
的空函数,当我想发出事件时调用它。
在我的第二个小部件中,我的代码是:
on(self._selector, "selectComplete", function(evt)
console.log(evt);
);
【讨论】:
这个要求是否需要定义一个函数 onXXX 以便在任何地方记录下的发射工作?我一直在为此苦苦挣扎,没有看到讨论过这个方面。 (谢谢,这正是我让我的自定义事件正常工作所需要的!)【参考方案2】:一定要把事情说清楚:onXXX 函数是旧的发射方式。 我对它很好,但它已被弃用!
“自我”到底是什么?你的意思是:“这个”?
任何从 dojo/Evented 继承的小部件都可以
on.emit(this, "select", anyProperty: 'will be mixed in the event');
以上内容正在冒泡,这似乎是您想要做的?
你也可以
this.emit("select", anyProperty: 'will be mixed in the event');
但这只会触发一次,不会冒泡。
如您所说,您可以从任何其他小部件订阅。 如果您需要一个工作示例,请告诉我。
【讨论】:
以上是关于dojo 小部件不会发出事件的主要内容,如果未能解决你的问题,请参考以下文章