AS3 Event Bubbling за пределами Scenegraph / DisplayList - PullRequest
2 голосов
/ 19 марта 2009

Привет, просто интересно, возможно ли воспользоваться преимуществами всплытия событий в классах не отображаемых списков в AS3.

Например, в модели приложения, где есть класс City, который содержит много автомобилей. Какие существуют методы для присоединения слушателя событий к объекту City и получения событий, которые всплывают от дочерних автомобилей. Чтобы прояснить, объекты City и Car не являются частью списка отображения, они не являются объектами DisplayObject. Так может ли пузыри быть реализованы вне списка отображения?

Насколько я знаю, это невозможно без ручного подключения слушателей событий к каждому объекту Car и повторной отправки события из объекта City. У кого-нибудь еще есть более чистое решение?

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Этот класс был моим решением этой проблемы. В основном, ваши классы, которые обычно расширяют EventDispatcher, вместо этого расширяют BubblingEventDispatcher

, а затем вызовите функцию addChildTarget (target: BubblingEventDispatcher), чтобы настроить дочерние элементы, из которых можно ловить всплывающие события.

Это решение использует спрайт для каждого диспетчера событий, но приводит к использованию только 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 голос
/ 19 марта 2009

Я не уверен, что полностью понимаю, но когда вы создаете событие, вы можете сказать, что оно пузырится, и поэтому, когда оно отправляет, оно будет пузыриться.

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

Захват и всплытие происходят, когда объект Event перемещается от узла к узлу в списке отображения: родительский для захвата и дочерний к родительскому для пузырькового отображения. Этот процесс не имеет ничего общего с иерархией наследования. Только объекты DisplayObject (визуальные объекты, такие как контейнеры и элементы управления) могут иметь фазу захвата и фазу пузырьков в дополнение к фазе нацеливания.

Единственный способ, с помощью которого я могу это увидеть, - это зарегистрировать ребенка с родителем (автомобиль с городом) каждый раз, когда новый ребенок добавляется в качестве ребенка. В этот момент вы можете добавить прослушиватель событий в родительском (город), а затем повторно отправлять событие из родительского (города) каждый раз, когда событие обрабатывается от дочернего (автомобиля). Это ужасно, я знаю, и вы хотели бы убедиться, что вы удаляете прослушиватель событий в любое время, когда вы удаляете дочернего элемента, но это единственное реальное решение, которое я вижу.

0 голосов
/ 06 мая 2009

Я не уверен, в каком году это было опубликовано, но я только что обнаружил это, и мальчик, это глупо. Почему пузыри зависеть от списка отображения? Мне кажется, что при построении модели Event в AS3 Adobe должна была реализовывать всплывание для любых классов. Мне нужно передавать данные между разнородными классами гораздо чаще, чем нужно, чтобы несколько экранных объектов слушали друг друга. Не говоря уже о том, что гораздо проще ссылаться на экранные объекты с помощью списка отображения и корневого каталога, чем ссылаться на динамический экземпляр, используемый динамическим экземпляром, который используется динамическим экземпляром (вы его получаете). Модель событий AS2 не так уж и далека от той модели событий AS3, в конце концов

...