Dojo Evented - “加载”事件未被触发/捕获

时间:2015-07-11 19:03:31

标签: javascript events dojo

我有一个继承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捕获?

通常, 如果由两个对象触发的两个事件具有相同名称,会发生什么?为每个事件唯一命名是否更好?

谢谢, 艾伦

1 个答案:

答案 0 :(得分:1)

如果您的班级继承了dijit/_WidgetBase,那么我对onemit的处理方式存在一些差异,我可能会怀疑这会导致您的问题。

首先,_WidgetBase won't emit DOM events在小部件调用startup之前或在/之后被销毁。换句话说,它不会在constructorpostscriptbuildRenderingpostCreate期间发出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就足够了,因为它已经定义了自己的_WidgetBaseemit(上面链接)。