我有一个继承dojo/Evented的班级。我在代码中调用了myClass.emit("load",{})
。并通过myClassInstance.on("load",function(){console.log("fired!")});
然而,它没有被解雇。但有趣的是,如果我改为myClass.emit("myClass-load",{})
并按myClassInstance.on("myClass-load",function(){console.log("fire")});
收听,事件就会被解雇!
我在这里想念什么?是因为其他对象也听“加载”事件所以它不被myClassInstance捕获?
通常, 如果由两个对象触发的两个事件具有相同名称,会发生什么?为每个事件唯一命名是否更好?
谢谢, 艾伦
答案 0 :(得分:1)
如果您的班级继承了dijit/_WidgetBase
,那么我对on
和emit
的处理方式存在一些差异,我可能会怀疑这会导致您的问题。
首先,_WidgetBase won't emit DOM events在小部件调用startup
之前或在/之后被销毁。换句话说,它不会在constructor
,postscript
,buildRendering
和postCreate
期间发出DOM事件。
其次,_WidgetBase包含一些公认的复杂逻辑,用于向后兼容遗留小部件,后者通过onXxx
命名模式之后的方法实现事件。即使存在匹配的_WidgetBase#emit
方法,onXxx
仍会触发DOM事件,_WidgetBase#on
will not listen for the DOM event如果首先找到onXxx
方法,则会{{3}}。
因此,我建议确定两件事:
emit
之前未在小部件上调用startup
onLoad
方法我想我应该指出的最后一件事是你不应该让一个类继承 {/ 1>}和_WidgetBase
,因为这可能会导致意外的副作用小部件逻辑,特别是如果您正在扩展现有的Dijit小部件。单独扩展Evented
就足够了,因为它已经定义了自己的_WidgetBase
和emit
(上面链接)。