Flex:如何在ItemRenderer中侦听事件



我试图在ItemRenderer中创建一个EventListener,但它不起作用。如何在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");
      }

这可能有点晚了,但根据您的示例,您的ItemRenderer正在监听自己——这就是为什么您永远不会得到事件的原因。至于冒泡,请记住,在目标和捕获阶段,事情都是从这个阶段开始的,一直到调度目标,然后再往下退。由于渲染器是列表的子级,因此它永远不会接收到此事件。

如果您希望IR从列表中获取事件,则需要对列表的引用-通常是所有者。在这种情况下,这是owner.addEventListener()。您还可以查看分配给每个渲染器的ListData,在该复合对象中是对列表的引用。

直接从文档中获取:

事件目标充当事件如何在显示列表层次结构中流动的焦点。当鼠标点击或按键等事件发生时,Flash Player或AIR应用程序会将事件对象从显示列表的根分派到事件流中。然后,事件对象通过显示列表,直到到达事件目标,此时它开始返回显示列表。从概念上讲,到事件目标的往返旅程分为三个阶段:捕获阶段包括从根到事件目标节点之前的最后一个节点的旅程,目标阶段仅包括事件目标节点,冒泡阶段包括在返回显示列表的根时遇到的任何后续节点

您需要稍微小心一点,因为ItemRenderer是ClassFactory创建方法的一部分每个渲染器都将被分配此侦听器-这可能是您想要的,也可能不是您想要的。

我在谷歌上找到了gskinner中的解决方案。但是,通过使用此方法,ItemRenderer中的每个项目都将接收一个事件,因此,如果您(在ItemRendererer中)有100个项目,则将记录100个事件。

最新更新