Распространение событий Flex 3 на составной пользовательский компонент?

У меня есть настраиваемый компонент, состоящий из выбираемого элемента управления (радиокнопки) и ввода текста. Я хочу выполнить некоторую логику в ответ на события изменения от обоих этих элементов управления, но после этого я хочу, чтобы все, что зарегистрировано в обработчике изменений составного компонента, также имело изменение для обработки событий. Проблема в том, что когда я повторно отправляю события, цель события изменилась на мой пользовательский компонент, теряя цель исходного события.

Вот мой нестандартный компонент:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" label="{listItem.@text}" data="{[email protected]()}">

    <mx:Script>
        <![CDATA[
            import mx.controls.RadioButtonGroup;
            [Bindable]
            public var selected: Boolean;
            [Bindable]
            public var text: String;
            [Bindable]
            public var listItem: XML;
            [Bindable]
            public var group: RadioButtonGroup;

            private function onSelectionChange(event: Event): void {
                selected = event.target.selected;
                dispatchEvent(event);
            }

            private function onTextChange(event: Event): void {
                text = event.target.text;
                dispatchEvent(event);
            }
        ]]>
    </mx:Script>

    <mx:RadioButton group="{group}" label="{label}" selected="{selected}" change="onSelectionChange(event)"/>
    <mx:TextInput width="100%"
                  maxChars="{listItem.specify.@entryLength}"
                  enabled="{selected}"
                  visible="{listItem.hasOwnProperty('specify')}"
                  includeInLayout="{visible}"
                  change="onTextChange(event)"/>
</mx:HBox>

В обработчике событий, который получает события изменения от этого компонента, я вижу, что event.target является экземпляром SpecifyRadioButton, а не TextInput или RadioButton, как я ожидал. Как мне распространить событие, чтобы получить здесь то, что я хочу?

Getting event [Event type="change" bubbles=false cancelable=false eventPhase=2] 
from question0.tabSurvey.questionForm.questionContainer.Single94.VBox95.SpecifyRadioButton111

person Chris R    schedule 24.07.2009    source источник


Ответы (2)


Вместо повторной отправки исходного события создайте новое событие и передайте исходное событие как свойство origEvent. Новое событие, которое отправляет SpecifyRadioButton, может быть либо настраиваемым классом событий, который расширяет Event, либо вы можете полениться и просто использовать mx.events.DynamicEvent.

Пример:

import mx.events.DynamicEvent;

private function onSelectionChange(event: Event): void {
    selected = event.target.selected;
    var newEvent:DynamicEvent = new DynamicEvent(Event.CHANGE);
    newEvent.origEvent = event;
    dispatchEvent(newEvent);
}

Затем в обработчиках события SpecifyRadioButton.change укажите свойство event.origEvent.

person N Rohler    schedule 24.07.2009

Имеет смысл, что целью события будет SpecifyRadioButton, потому что это то, что отправляет событие.

Событие «изменения» компонента TextInput настроено так, чтобы не всплывать, что означает, что его могут прослушивать слушатели в том же компоненте, что и он, но нигде больше. Если вы хотите, чтобы событие изменения вспыхнуло, вам нужно будет расширить класс TextInput (или использовать что-то отличное, например Приятель).

package {

    import flash.events.Event;
    import mx.controls.TextInput;

    public class CarbonatedTextInput extends TextInput {
        public function CarbonatedTextInput () {
            super();
            addEventListener(Event.CHANGE, forceBubbles);
        }

        /* 
           We have to remove the event listener before we
           dispatch the new event (with bubbles!) because
           otherwise our listener in the constructor would
           catch us and put us in an endless loop...
           resulting in a **STACK OVERFLOW** 
        */
        protected function forceBubbles(e:Event):void {
            removeEventListener(Event.CHANGE, forceBubbles);
            dispatchEvent(new Event(Event.CHANGE, true));
            addEventListener(Event.CHANGE, forceBubbles);
        }
    }
}
person Buns of Aluminum    schedule 24.07.2009