我有一个继承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没有捕获到它吗?
通常, 如果由两个对象引发的两个事件具有相同的名称,会发生什么?对每个事件进行唯一命名更好吗?
谢谢,Allen
如果您的类继承了dijit/_WidgetBase
,那么它对on
和emit
的处理方式存在一些差异,我可能怀疑这些差异会导致您的问题。
首先,_WidgetBase在小部件调用startup
之前或在它被销毁之后/期间不会发出DOM事件。换句话说,它在constructor
、postscript
、buildRendering
和postCreate
期间不会发出DOM事件。
其次,_WidgetBase包含一些公认的复杂逻辑,用于与遗留小部件的向后兼容性,遗留小部件通过遵循onXxx
命名模式的方法实现事件。虽然即使存在匹配的onXxx
方法,_WidgetBase#emit
仍将激发DOM事件,但如果_WidgetBase#on
首先找到onXxx
方法,则它将不侦听DOM事件。
因此,我建议确保两件事:
startup
之前没有在小部件上调用emit
- 该小部件还没有
onLoad
方法
我想我应该指出的最后一件事是,不应该让一个类同时继承_WidgetBase
和Evented
,因为这可能会在小部件逻辑中造成意外的副作用,尤其是在扩展现有Dijit小部件的情况下。单独扩展_WidgetBase
就足够了,因为它已经定义了自己的emit
和on
(如上所述(。