2011-01-12 151 views
0

我在事件冒泡中看到了一些怪异,这表明我真的不明白这应该如何工作。事件冒泡奇怪

我有一个扩展DataGroup的组件,它的项目渲染器调度一个事件(泡泡)。

// MyRenderer.mxml 
<s:ItemRenderer> 
    <s:Button click='dispatchEvent(new Event('customEvent',true))' /> 
</s:ItemRenderer> 

DataGroup将事件的侦听器添加到自身。

// MyDataGroup.mxml 
<s:DataGroup itemRenderer="MyRenderer" creationComplete='onCreationComplete()'> 
    <fx:Metadata> 
     [Event(name='customEvent',type='flash.events.Event')] 
    </fx:Metadata> 
    <fx:Script> 
     private function onCreationComplete():void 
     { 
      addEventListener('customEvent',onCustomEvent); 
     } 
     private function onCustomEvent(event:Event):void 
     { 
     } 
    </fx:Script> 
</s:DataGroup> 

数据组的父项也正在为该事件添加侦听器。

// MyComponent.mxml 
<s:Group> 
    <MyDataGroup customEvent='onCustomEventHandler()' /> 
</s:Group> 

我会预计在MyDataGroup注册的处理程序应该先抓住事件,那么处理程序MyComponent

但是,我看到相反 - 即,在MyComponent中捕获,然后在MyDataGroup。被捕时,event.phase == EventPhase.BUBBLING

这是怎么回事?为什么我看到这种行为?

我正在使用Flex 4.0。

+1

MyDataGroup没有事件侦听器的处理函数。我认为这是一个复制和粘贴错字,因为我不希望你的代码实际编译该错误。请指定您使用的SDK版本。你理解什么应该与我的相似,所以这种行为是意想不到的。每个组件都在单独的文件中?或者你在线做事情? – JeffryHouser 2011-01-12 18:01:30

+0

谢谢,我已更新纠正错误(是的,只是一个复制'N'贴问题)。所有类都有自己的mxml文件。 – 2011-01-12 18:08:03

回答

2

我敢肯定,问题是你的两个事件监听器正在监听MyDataGroup组件上的同一个实例。

如果添加了一个事件监听器myComponent的,而不是MyDataGroup,你会得到预期的行为:

<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" width="400" height="300" 
      initialize="group1_initializeHandler(event)"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 
      public function onCustomEventHandler(event:Event):void{ 
       trace('my Component handler'); 
      } 

      protected function group1_initializeHandler(event:FlexEvent):void 
      { 
       // add the event listener to 'this' 
       this.addEventListener('customEvent',onCustomEventHandler); 
      } 

     ]]> 
    </fx:Script> 
    <martyPitt:MyDataGroup id="dataGroup" /> 
    <!-- The event listener here was listening on the myDataGroup instance, not on the MyComponent instance customEvent="onCustomEventHandler(event)" --> 
</s:Group> 

我怀疑事件侦听器 - 即使不在同一个组件 - 是基于射击按照他们添加的顺序。您必须使用编译器参数'-keep'来检查生成的ActionScript,以明确指出。我怀疑你的内联监听器(MyComponent)被添加到MyDataGroup构造函数中。由于另一个侦听器在MyDataGroup中添加了一个creationComplete处理函数,MyComponent侦听器首先触发。

0

确实是奇怪的行为。

其实,当你添加一个事件侦听器内联(在你的榜样:

<MyDataGroup 
customEvent='onCustomEventHandler()' 
/> 

),框架上添加捕获阶段事件侦听器。所以这是它首先进入父处理程序的预期行为。我不明白的是eventPhase等于EventPhase.BUBBLE_PHASE,尽管它应该显示EventPhase.CAPTURE_PHASE。

+0

-1我能够接受Marty的代码,并复制他的结果与Flex 4.0 SDK。 EventPhase肯定会显示'3',根据文档是冒泡阶段。 (http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html);并且事件监听器执行和意外的顺序。奇怪 – JeffryHouser 2011-01-12 21:04:30