Вопрос о захвате события нажатия кнопки в ДРУГОМ MXML-файле - PullRequest
0 голосов
/ 24 августа 2010

это кажется интересным вопросом, который нужно обнаружить во 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()" />

Он отлично работает при нажатиикнопка каждый раз.Теперь мне нужно что-то интересное, то есть я хочу перехватить событие ButtonClick в другом файле mxml, скажем B.mxml, и сделать что-то в B.mxml вместо A.

Я немного застрялНадеюсь, вы могли бы дать мне подсказку и помощь, большое спасибо.

1 Ответ

2 голосов
/ 24 августа 2010

Существует несколько подходов к этой проблеме.Самым простым (и наименее объектно-ориентированным) является то, чтобы 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>

Вам нужно сделать так, чтобы A знал о 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...