2009-07-24 55 views
2

我有一个由可选控件(单选按钮) 和文本输入组成的自定义组件。我想执行一些逻辑以响应来自这两个控件的 更改事件,但在此之后,我希望 在复合组件的更改处理程序 上注册的任何内容都有更改以处理事件。问题是,当我 重新分派事件时,事件目标已更改为我的自定义 组件,从而失去原始事件的目标。组合自定义组件上的Flex 3事件传播?

这里是我的自定义组件:

<?xml version="1.0" encoding="utf-8"?> 
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" label="{[email protected]}" 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="{[email protected]}" 
        enabled="{selected}" 
        visible="{listItem.hasOwnProperty('specify')}" 
        includeInLayout="{visible}" 
        change="onTextChange(event)"/> 
</mx:HBox> 

在接收来自这个组件的改变事件的事件处理程序,我 看到event.target是SpecifyRadioButton的一个实例,而不是 的TextInput或单选按钮,因为我期待。我应该如何宣传 活动以获得我想要的内容?

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

回答

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财产。

2

它是有道理的事件的目标将SpecifyBadioButton,因为这就是调度事件。

TextInput组件的“更改”事件设置为不起泡,这意味着它可以由与其相同的组件中的侦听器进行侦听,但无法在其他位置进行侦听。如果你想让变化事件冒泡,你将不得不扩展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); 
     } 
    } 
}