Почему не отправка события? - PullRequest
0 голосов
/ 06 февраля 2012

хорошо, вот моя проблема в моем основном проекте. Я пытаюсь вызвать событие с помощью dispatchEvent. Я сделал простой тестовый класс для проверки этого, но он все еще не работает ...

Вот тестовый класс

package 
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite 
{
    public function Main() {

        stage.addEventListener("pOver", rake);


        dispatchEvent(new Event("pOver"));
    }


    public function rake(e:Event):void {

        trace("working");
    }

}

Почему он не стреляет?или почему слушатель не захватывает это событие?

Ответы [ 2 ]

7 голосов
/ 06 февраля 2012

Вы отправляете событие на Main, который является потомком Stage.Если вы хотите специально отправить событие на Stage, используйте:

stage.dispatchEvent(new Event("pOver"));

Теперь вы можете задаться вопросом: «Если это ребенок, то мой обработчик событий все равно должен запускаться!"

Ну, да, и нет.

Давайте взглянем на простую диаграмму жизненного цикла события:

enter image description here

Сначаласобытие, которое вы отправляете, не является пузырем Event.Изучив конструктор Event, его подпись выглядит следующим образом:

public function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)

Обратите внимание, что второй аргумент по умолчанию false, что означает, что это событие не выполняет всплывающую частьжизненного цикла события.

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

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

Обратите внимание на третий аргумент.Что по умолчанию false снова.Это означает, что вы присоединяетесь к «пузырящейся» стороне события.

Это означает, что это событие попадает к целевому элементу, экземпляру Main, а затем останавливается и никуда не уходит.

TL; DR : Так, что это все значит?

Так, чтобы вызвать ваш обработчик событий, , а не изменить гдесобытие отправляется , вам нужно изменить событие, которое вы запускаете, на:

this.dispatchEvent(new Event("pOver", true));  // this event will bubble

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

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

stage.addEventListener("pOver", rake, true); // attach to a capturing side

I полагаю , что событие всегда будет проходить через фазу захвата, даже если они помечены как не пузырьковые.Но я могу ошибаться в этом.Я просто не могу вспомнить, пропускают ли «не пузырьковые» события и фазы захвата, и пузырьковые события, и просто запускаю целевую фазу события, и у меня нет времени проверять это прямо сейчас.


Edit

Итак, я написал быстрый тест на wonderfl :

package {
    import flash.events.Event;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {

        private var debug:TextField;

        public function FlashTest() {
            stage.addEventListener("Foo", bubbleFooHandler);
            stage.addEventListener("Foo", captureFooHandler, true);

            trace("Ready");

            trace("---------------");
            trace("Trying a non-bubbling event");
            this.dispatchEvent(new Event("Foo"));

            trace("---------------");
            trace("Trying a bubbling event");
            this.dispatchEvent(new Event("Foo", true));
        }

        private function captureFooHandler(e:Event):void {
            trace("Triggered \"Foo\" from capturing phase\n");
        }

        private function bubbleFooHandler(e:Event):void {
            trace("Triggered \"Foo\" from bubbling phase");
        }
    }
}

Выход из этого

Ready
---------------
Trying a non-bubbling event
Triggered "Foo" from capturing phase
---------------
Trying a bubbling event
Triggered "Foo" from capturing phase
Triggered "Foo" from bubbling phase

Обратите внимание, что события всегда будут проходить через фазу захвата.Однако, если они не помечены как «пузырящиеся события», смотрите выше, они будут спускаться через дерево, которое они останавливают, когда достигают цели события (EventDispatcher, на которое было отправлено событие).

Пузырьковые события, с другой стороны, развернутся и вернутся вверх дерева.

Надеюсь, это прояснит ситуацию.

1 голос
/ 06 февраля 2012

Прежде всего, вы слушаете сценические события.Это означает, что пока stage не отправляет Events, вы не получите никаких обратных вызовов.

попробуй

stage.dispatchEvent(new Event("pOver"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...