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);
);

对于听众,我试过收听onSelectCompleteselectCompleteSelectCompleteselectcompleteselect-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 小部件不会发出事件的主要内容,如果未能解决你的问题,请参考以下文章

子部件在 Dojo 中不会渲染(高度为 0)

Dojo 选择小部件验证

访问模板化小部件外部的 dojo 附加点

Dojo dijit.form.select:创建新的选择小部件后,旧小部件的选定值无法更改

Dojo vs JQuery 编程小部件创建

Dojo Dijit - 小部件中的小部件