AS3 отправляет события на объекты, не относящиеся к списку отображения - PullRequest
0 голосов
/ 18 ноября 2009

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

var objA = new ObjA;
addChild(objA);

var objB = new ObjB;
addChild(objB);

var objC = new ObjC;
objB.addChild(objC);

Объект B может прослушивать события, отправляемые объектом C. Но мне также нужен объект A, чтобы прослушивать события, отправляемые объектом C. Кроме того, эти объекты создаются в разных классах, поэтому я не могу жестко ссылаться друг на друга. Решение

Ответы [ 3 ]

0 голосов
/ 18 ноября 2009
Решение

: Если ваши события должным образом всплывают, вы должны иметь возможность установить прослушиватель на сцене из любого класса, который расширяет DisplayObject и находится в цепочке отображения.

catch: Если вы просто слушаете стандартные события, вы по-настоящему не сможете определить, откуда они берутся, если только вы не знаете, что конкретное событие может происходить только из одного «места».

исправлено: в подобных случаях лучше отправлять пользовательские события.


внутри любого класса, который расширяется DisplayObject

stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler)
0 голосов
/ 26 марта 2010

нет необходимости удалять ваших слушателей, если вы используете последний параметр addEventListener (), который должен быть установлен в true это означает, что ваш слушатель будет использовать слабую ссылку, и, следовательно, не помешает GC собрать владельца слушателя.

0 голосов
/ 18 ноября 2009

Тогда, вероятно, вы можете сделать Singleton EventDispatcher и использовать его во всех классах для отправки события.

package <WHATEVER>
{
  import flash.events.*;
  public class SingletonDispatcher extends EventDispatcher {
    private static var dispatcher:SingletonDispatcher = null;
    public function SingletonDispatcher (enforcer:SingletonEnforcer) : void {
      if (!enforcer) {
       throw new Error("Direct instatiation is not allowed");
      }
      return;
    }// end function
    public static function GetInstance() : SingletonDispatcher {
      if (!dispatcher) {
        dispatcher= new SingletonDispatcher (new SingletonEnforcer());
      }// end if
      return dispatcher;
    }// end function
  }
}
class SingletonEnforcer {}

Тогда вы можете использовать во всех классах, как:

public class C {
...
SingletonDispatcher.GetInstance().dispatchEvent(new SomeEvent()); // instead of this.dispatchEvent
...
}

А в классе A вы можете послушать:

public class A {
  ...
  SingletonDispatcher.GetInstance().addEventListener(SomeEvent.UNREACHABLE_EVENT, thankGod);
  ...
}
...