在某些情况下,我似乎无法获得接收事件的组件。
[edit]
为了澄清,示例代码仅用于演示,我真正要问的是,是否有一个可以添加侦听器的中心位置,可以可靠地向任意对象发送事件和从任意对象发送事件。
我最终使用parentApplication来发送和接收我需要处理的事件。
[/编辑]
如果两个组件有不同的父组件,或者如下例所示,一个是弹出窗口,看起来事件永远不会到达监听器(请参阅方法“popUp”以了解不起作用的分派):
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="init()">
<mx:Script>
<![CDATA[
import mx.controls.Menu;
import mx.managers.PopUpManager;
// Add listeners
public function init():void
{
this.addEventListener("child", handleChild);
this.addEventListener("stepchild", handleStepchild);
}
// Handle the no pop button event
public function noPop(event:Event):void
{
dispatchEvent(new Event("child"));
}
// Handle the pop up
public function popUp(event:Event):void
{
var menu:Menu = new Menu();
var btnMenu:Button = new Button();
btnMenu.label = "stepchild";
menu.addChild(btnMenu);
PopUpManager.addPopUp(menu, this);
// neither of these work...
this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]);
btnMenu.dispatchEvent(new Event("stepchild", true));
}
// Event handlers
public function handleChild(event:Event):void
{
trace("I handled child");
}
public function handleStepchild(event:Event):void {
trace("I handled stepchild");
}
]]>
</mx:Script>
<mx:VBox>
<mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/>
<mx:Button label="PopUp" id="btnPop" click="popUp(event)"/>
</mx:VBox>
</mx:Application>
我可以想到解决方法,但似乎应该有一些中央事件总线...
我错过了什么吗?
答案 0 :(得分:2)
以上是正确的。 您正在从btnMenu调度该事件,但您没有在btnMenu上监听事件 - 您正在侦听应用程序上的事件。
从应用程序发送:
dispatchEvent(new Event("stepchild", true));
或听取btnMenu
btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
答案 1 :(得分:0)
从this
发送事件时,您正在将侦听器附加到btnMenu
。
这应该有效:
dispatchEvent(new Event("stepchild", true));
PS。除非明确要求克服范围问题,否则没有理由在任何地方放置不必要的“this
”。在这种情况下,您可以将每个this
留出来。