有关捕获另一个mxml文件中的按钮单击事件的问题

时间:2010-08-24 14:45:17

标签: flex

这似乎是一个有趣的问题,有待在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中做一些事情。

我有点困惑,希望你能给我一些提示和帮助,非常感谢。

1 个答案:

答案 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;