这似乎是一个有趣的问题,有待在Flex中发现。
我在A.mxml中注册了一个非常简单的按钮事件监听器:
<mx:Script><![CDATA[
import mx.controls.Alert;
public function Handler():void
{
Alert.show('click event occured');
}
]]></mx:Script>
<mx:Button label="{resourceManager.getString('resources', 'button.startLab')}"
id="nextStepButton" click="Handler()" />
每次点击按钮都可以正常工作。 现在我想要有一些有趣的东西,也就是说,我想在另一个mxml文件中捕获这个按钮Click事件,比如B.mxml并在B.mxml而不是A中做一些事情。
我有点困惑,希望你能给我一些提示和帮助,非常感谢。
答案 0 :(得分:2)
这个问题有很多种方法。最简单的(也是最少面向对象的)是让A知道B,反之亦然。在这种情况下,您只需添加一个监听器。在B中你可以说a.nextStepButton.addEventListener(MouseEvent.CLICK,myHandler),或者在A中你可以这样做.nextStepButton.addEventListener(MouseEvent.CLICK,b.myHandler)。 (当实例化一个组件时,您必须在另一个组件上设置对它的引用。)
更好的一步是派遣一个气泡的自定义事件,其中一个组件仍然知道另一个。在B:a.addEventListener(CustomNavigationEvent.NEXT_CLICK,myHandler)或A:b.addEventListener(CustomNavigationEvent.NEXT_CLICK,myHandler)。
进一步说,你可以让事件冒泡到顶部(SystemManager)并将你的监听器添加到SystemManager。这样B就完全不知道A.在B:this.systemManager.addEventListener(CustomNavigationEvent.NEXT_CLICK,myHandler)。
更进一步,您可以实现自己的事件广播器版本,这只是第三个对象,任何组件都可以访问,通常实现为单例,它接受侦听器注册并接受事件派发,然后广播注册听众的活动。
希望有所帮助。
编辑:这是第一种方式的代码:
在A.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="onCreationComplete(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
public var b:B;
private function onCreationComplete(e:FlexEvent):void {
// Note that you have to have a public onClick handler in B
this.myButton.addEventListener(MouseEvent.CLICK, b.onClick);
}
]]>
</fx:Script>
<s:Button id="myButton"/>
</s:Group>
您需要在容器中识别B以声明A和B的实例:
MXML:
<mypackage:A id="aComponent" b="bComponent"/>
<mypackage:B id="bComponent"/>
等效的ActionScript:
var aComponent:A = new A();
var bComponent:B = new B();
aComponent.b = bComponent;