Dojo 事件 - "load"事件未触发/捕获



我有一个继承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,那么它对onemit的处理方式存在一些差异,我可能怀疑这些差异会导致您的问题。

首先,_WidgetBase在小部件调用startup之前或在它被销毁之后/期间不会发出DOM事件。换句话说,它在constructorpostscriptbuildRenderingpostCreate期间不会发出DOM事件。

其次,_WidgetBase包含一些公认的复杂逻辑,用于与遗留小部件的向后兼容性,遗留小部件通过遵循onXxx命名模式的方法实现事件。虽然即使存在匹配的onXxx方法,_WidgetBase#emit仍将激发DOM事件,但如果_WidgetBase#on首先找到onXxx方法,则它将侦听DOM事件。

因此,我建议确保两件事:

  • startup之前没有在小部件上调用emit
  • 该小部件还没有onLoad方法

我想我应该指出的最后一件事是,不应该让一个类同时继承_WidgetBaseEvented,因为这可能会在小部件逻辑中造成意外的副作用,尤其是在扩展现有Dijit小部件的情况下。单独扩展_WidgetBase就足够了,因为它已经定义了自己的emiton(如上所述(。

最新更新