2012-04-02 97 views
0

我試圖讓ItemRenderer中有一個EventListener,但它不起作用。如何聆聽ItemRenderer中的事件?Flex:如何收聽ItemRenderer中的事件

----在MainHomeView.mxml ----

<fx:Metadata> 
    [Event(name="myEvent", type="flash.events.Event")] 
</fx:Metadata> 

protected function btnAdd_clickHandler(event:MouseEvent):void {  
    var eventObject:Event = new Event("myEvent", true, true); 
    dispatchEvent(eventObject);  
} 

----在UserRenderer.mxml(ItemRenderer的)---

protected function init(event:FlexEvent):void{ //run in CreationComplete 
     addEventListener("myEvent", onHandleEvent); 
     } 

protected function onHandleEvent():void { 
     trace("Event received"); 
     } 
+0

itemrenderer不在您點擊處理程序的Button的事件傳播路徑中。你可以嘗試'list.dispatchEvent(eventObject)',但我不認爲這也可以。你爲什麼不操縱數據提供者而不是這個? – 2012-04-02 19:59:23

+0

@SamDeHaan所以你說在itemRenderer中沒有辦法擁有一個監聽器,即使有自定義事件?嗯,太糟糕了 – jameslcs 2012-04-02 20:05:22

+0

這是可能的,但事件只從調度員傳播「向上」。 http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html你需要找到一種方法來在事件「下方」發送事件,這將是困難的。 – 2012-04-02 20:14:00

回答

0

我有谷歌和發現解決方案在gskinner。但通過使用此方法,ItemRenderer中的每個項目都會收到一個事件,因此如果您有100個項目(在您的ItemRenderer中),您將rec'd 100個事件。

0

這可能有點晚,但根據您的示例,您的ItemRenderer正在傾聽自己 - 這就是爲什麼您永遠無法獲得該活動的原因。至於冒泡,記住在目標和捕捉階段,事情從舞臺開始,一直到調度目標,然後再回落。由於您的渲染器是列表中的子項,因此它將永遠不會收到此事件。

如果您希望IR從列表中獲取活動,您需要參考列表 - 通常是店主。在這種情況下,這是owner.addEventListener()。您還可以查看分配給每個渲染器的ListData,並且該複合對象是對列表的引用。從文檔

直:

事件目標作爲焦點事件是如何流經顯示列表層次結構。發生鼠標單擊或按鍵事件時,Flash Player或AIR應用程序會將事件對象分配到顯示列表的根的事件流中。然後事件對象通過顯示列表直到達到事件目標,此時它通過顯示列表開始其返回行程。該事件目標的往返旅程在概念上被劃分爲三個階段:捕獲階段包括事件目標節點之前從根到最後節點的旅程,目標階段僅包括事件目標節點,並且冒泡階段包括回程中遇到的顯示列表的根的任何後續節點

你需要與此小心一點,因爲ItemRenderer的是創造的ClassFactory方法每個渲染器將被分配的一部分這個聽衆 - 這可能是也可能不是你想要的。

+0

我發現在IR裏聽事件並不是件好事,我曾經用另一種方式來解決我的問題。謝謝 – jameslcs 2012-04-12 05:36:49