AS3事件在Scenegraph / DisplayList之外冒泡

时间:2009-03-19 13:52:11

标签: actionscript-3 events event-bubbling

您只是想知道是否可以利用AS3中非显示列表类中的事件冒泡。

例如,在包含许多汽车的City类的应用程序模型中。有什么方法可以将事件侦听器附加到City对象并接收从子Cars中冒出的事件。为了阐明City和Car对象不是显示列表的一部分,它们不是DisplayObjects。那么可以以某种方式在显示列表之外实现冒泡吗?

据我所知,如果不将事件侦听器手动附加到每个Car对象并从City对象重新调度该事件,则无法实现。其他人有更清洁的解决方案吗?

3 个答案:

答案 0 :(得分:2)

这个课程是我解决这个问题的方法。基本上你的类通常会扩展EventDispatcher而不是扩展BubblingEventDispatcher

然后调用addChildTarget(target:BubblingEventDispatcher)函数来设置可以捕获起泡事件的子项。

此解决方案为每个事件调度程序使用一个sprite,但每个类只产生1个字节的额外内存使用量

package 
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.EventDispatcher;

 public class BubblingEventDispatcher extends EventDispatcher
 {
  //We have to use a sprite to take advantage of flash's internal event bubbling system
  private var sprite:Sprite;

  public function BubblingEventDispatcher()
  {
   //initialize our sprite
   sprite = new Sprite();
  }

  public override function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
  {
   sprite.addEventListener( type, listener, useCapture, priority, useWeakReference );
  }

  public override function dispatchEvent(event:Event):Boolean
  {
   return sprite.dispatchEvent( event );
  }

  //We must add child targets if we want to take advantage of the bubbling
  public function addChildTarget( target:BubblingEventDispatcher ):void
  {
   sprite.addChild( target.eventTarget as Sprite );
  }

  public function get eventTarget():EventDispatcher
  {
   return sprite;
  }
 }
}

答案 1 :(得分:1)

我不确定我是否完全理解,但是当你创建一个事件时,你可以说它会起泡,所以当它发送时它会冒泡。

http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html

http://livedocs.adobe.com/flex/3/langref/flash/events/Event.html#Event()

我相信这会允许您将事件监听器附加到您的城市以获取正确类型的事件,并且可以捕获汽车引发的事件。我没有尝试过这个,所以我不确定。

<强>更新

啊,我没有意识到这一点。你是对的。从以下链接:

http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html

  

当事件对象在显示列表中从一个节点移动到另一个节点时发生捕获和冒泡:用于捕获的父对象和用于冒泡的子对父。此过程与继承层次结构无关。除目标阶段外,只有DisplayObject对象(可视对象,如容器和控件)可以具有捕获阶段和冒泡阶段。

我可以看到周围的唯一方法是每次在孩童时添加新孩子时,将孩子与父母(带城市的汽车)一起注册。此时,您可以在父(城市)中添加事件侦听器,然后在从子(汽车)处理事件时从父(城市)重新分派事件。我知道它的丑陋,你想要确保你删除一个孩子时随时删除事件监听器,但这是我能看到的唯一真正的解决方案。

答案 2 :(得分:0)

我不确定这是哪一年发布的,但我刚刚发现了这个,而男孩是愚蠢的。为什么冒泡会依赖于显示列表?在我看来,在AS3中构建Event模型时,Adobe应该为任何类实现冒泡。我需要更频繁地在不同的类之间传递数据,而不是让我需要让多个显示对象互相监听。更不用说使用显示列表和根引用显示对象比引用动态实例使用的动态实例所使用的动态实例要容易得多(你得到它)。 AS2的事件模型与AS3的事件模型之后的距离并不遥远