2011-01-12 172 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