Flex 3事件在复合自定义组件上的传播?

时间:2009-07-24 20:42:49

标签: flex actionscript-3 flex3 event-handling

我有一个由可选控件(单选按钮)组成的自定义组件 和文本输入。我想执行一些逻辑来响应 从这两个控件中更改事件,但之后我想要 在复合组件的更改处理程序中注册的任何内容 也有改变来处理事件。问题是,当我 重新调度事件目标已更改为我的自定义的事件 组件,丢失原始事件的目标。

这是我的自定义组件:

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

    <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

2 个答案:

答案 0 :(得分:3)

不是重新调度原始事件,而是创建一个新事件并将原始事件作为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属性。

答案 1 :(得分:2)

事件的目标是SpecifyRadioButton是有意义的,因为这是调度事件的内容。

TextInput组件的“更改”事件设置为不冒泡,这意味着它可以由与其相同的组件中的侦听器进行侦听,但不能在其他任何地方进行侦听。如果你想让change事件冒出来,你将不得不扩展TextInput类(或使用像Mate这样漂亮的东西。)

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);
        }
    }
}