我有一个继承 dojo/Evented 的类。我在代码中调用 myClass.emit("load",{})
。并通过 myClassInstance.on("load",function(){console.log("fired!")});
但是,它没有被解雇。但有趣的是,如果我更改为 myClass.emit("myClass-load",{})
并通过 myClassInstance.on("myClass-load",function(){console.log ("fire")});
事件被触发!
我在这里错过了什么?是否因为其他对象也监听“load”事件,所以它没有被 myClassInstance 捕获?
通常,如果两个对象触发的两个事件具有相同的名称,会发生什么情况?为每个事件指定唯一的名称是否更好?
谢谢, 艾伦
最佳答案
如果您的类继承了 dijit/_WidgetBase
,我可能会怀疑它对 on
和 emit
的处理存在一些差异导致了您的问题。
首先,_WidgetBase won't emit DOM events在小部件调用 startup
之前或在它被销毁之后/同时。换句话说,它不会在其构造函数
、postscript
、buildRendering
和postCreate
期间发出DOM事件。
其次,_WidgetBase 包含一些公认的复杂逻辑,用于向后兼容旧版小部件,这些小部件通过遵循 onXxx
命名模式的方法实现事件。即使存在匹配的 onXxx
方法,_WidgetBase#emit
仍会触发 DOM 事件,_WidgetBase#on
will not listen for the DOM event如果它首先找到 onXxx
方法。
因此,我建议确保两件事:
emit
在startup
之前未在小部件上调用- 该小部件还没有
onLoad
方法
我想我应该指出的最后一件事是,你不应该让一个类继承两者 _WidgetBase
和 Evented
,因为这个可能会在小部件逻辑中导致意外的副作用,尤其是在扩展现有 Dijit 小部件时。单独扩展 _WidgetBase
就足够了,因为它已经定义了自己的 emit
和 on
(上面链接)。
关于javascript - Dojo Evented - "load"事件未触发/捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31360745/