【问题标题】:dojo widget won't emit eventdojo 小部件不会发出事件
【发布时间】: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 版本并在其中创建一个永久链接并在此处编辑

标签: javascript events dojo widget


【解决方案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'});

但这只会触发一次,不会冒泡。

如您所说,您可以从任何其他小部件订阅。 如果您需要一个工作示例,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多