我尝试在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");
}
答案 0 :(得分:0)
我有谷歌并在gskinner找到了解决方案。但是通过使用此方法,ItemRenderer中的每个项目都会收到一个事件,因此如果您有100个项目(在您的ItemRenderer中),您将记录100个事件。
答案 1 :(得分:0)
这可能有点晚了,但根据你的样本,你的ItemRenderer正在自己监听 - 这就是你永远不会得到这个事件的原因。至于冒泡,记住在目标和捕获阶段,事情从阶段开始,一直到调度目标,然后再次退回。由于您的渲染器是列表的子项,因此它永远不会收到此事件。
如果您希望IR从列表中获取该事件,则需要引用该列表 - 通常是所有者。在这种情况下,这是owner.addEventListener()。您还可以查看分配给每个渲染器的 ListData ,并且该复合对象是对列表的引用。
直接来自文档:
事件目标充当事件如何流经显示列表层次结构的焦点。当发生鼠标单击或按键等事件时,Flash Player或AIR应用程序会将事件对象调度到显示列表的事件流
。然后事件对象通过显示列表直到它到达事件目标,此时它开始通过显示列表返回行程。这个到事件目标的往返旅程在概念上分为三个阶段:捕获阶段包括在事件目标节点之前从根到最后节点的旅程,目标阶段仅包括事件目标节点,并且冒泡阶段包括返回到显示列表根目录的任何后续节点
你需要对此有点小心,因为ItemRenderer是ClassFactory创建方法的一部分每个渲染器都将被赋予这个监听器 - 这可能是也可能不是你想要的。