Как отправить настраиваемое событие из класса ActionScript 3 и прослушивать его в корне документа?

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

addEventListener(CustomVarEvent.pinClicked, pinClickedHandler);

function pinClickedHandler(e:CustomVarEvent) {
        trace("main says " + e.arg[0] + " clicked");//access arguments array
    }

package zoomify.viewer
{
import com.maps.CustomVarEvent;
    protected function hotspotClickHandler(event:MouseEvent):void {
        var hotspotData:Hotspot = hotspotsMap[event.currentTarget] as Hotspot;
        trace(hotspotData._name + " was clicked");
        /*if(hotspotData) {
            navigateToURL(new URLRequest(hotspotData.url), hotspotData.urlTarget);
        }*/
        dispatchEvent(new CustomVarEvent("pinClicked",true,false,hotspotData._name));
    }
}
package com.maps
{
// Import class
import flash.events.Event;
// CustomVarEvent
public class CustomVarEvent extends Event {
    public static const pinClicked:String = "pinClicked";
    // Properties
    public var arg:*;
    // Constructor
    public function CustomVarEvent(type:String, ... a:*) {
        var bubbles:Boolean = true;
        var cancelable:Boolean = false;
        super(type, bubbles, cancelable);
        arg = a;

    }

    // Override clone
    override public function clone():Event{
        return new CustomVarEvent(type, arg);
    };
}


}

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

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

Нужен ли диспетчер, чтобы пузыриться, чтобы пузыриться?

Кроме того, идентичны ли эти две строки функционально на основе константы pinClicked, определенной в моем CustomVarEvent?

 dispatchEvent(new CustomVarEvent(CustomVarEvent.pinClicked, hotspotData._name));

 dispatchEvent(new CustomVarEvent("pinClicked", hotspotData._name));

person Bryan    schedule 14.04.2009    source источник


Ответы (4)


Событие может всплывать в списке отображения только в том случае, если объект, отправивший событие, является DisplayObject (или предком DisplayObject, например Sprite или MovieClip), так что он может быть в списке отображения. И он добавляется в список отображения во время отправки события.

В написанном вами коде вообще нет строки, которая отправляет событие как часть класса, а просто функция в пакете, поэтому я не уверен, куда вы собираетесь ее переходить.

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


package zoomify.viewer
{
    import com.maps.CustomVarEvent;

    protected function hotspotClickHandler(event:MouseEvent):void
    {
        // BY THE WAY, event.currentTarget will return the actual object, so you
        // don't need whatever the hotspotsMap[] thing is, just cast event.currentTarget
        /*var hotspotData:Hotspot = hotspotsMap[event.currentTarget] as Hotspot;*/
        var hotspotData:Hotspot = event.currentTarget as Hotspot;

        // here we dispatch the event off of the target, since it is definitely
        // in the display list already, so therefore bubbling will work right
        event.target.dispatchEvent(new CustomVarEvent("pinClicked",true,false,hotspotData._name));
    }
}
person Bryan Grezeszak    schedule 15.04.2009
comment
В этом есть смысл. Вау! Почему в предоставленном вами коде событие отправляется event.target вместо event.currentTarget (hotspotData)? - person Bryan; 15.04.2009
comment
event.currentTarget - это любой объект, который прослушивал MouseEvent, event.target - это любой объект, отправивший MouseEvent. В любом случае, в данном случае это, вероятно, ваша точка доступа. Но поскольку нажали event.target, я на 100% знаю, что это экранный объект на сцене, поэтому выбрал именно его :) - person Bryan Grezeszak; 15.04.2009
comment
Спасибо, Брайан. Поскольку этот ответ настолько ясен, я проверил некоторые другие ответы в вашем профиле. Я многому у тебя учусь. - person Bryan; 16.04.2009

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

person Stiggler    schedule 14.04.2009

Пузырьки работают только тогда, когда объект, отправляющий событие, находится в списке отображения. Какой внук эстрады.

Это и есть ваша проблема, но из фрагмента кода я не вижу, добавляете ли вы класс диспетчеризации в список отображения.

Кроме того, похоже, что вы создали не настраиваемый EventDispatcher, а настраиваемый Event. Но я могу ошибаться (не вижу весь ваш код).

person Jacob Poul Richardt    schedule 15.04.2009
comment
Прошу прощения, но как этот ответ отличается от того, что я предоставил? - person Stiggler; 15.04.2009

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

yourDispatcher.addEventListener (CustomVarEvent.pinClicked, pinClickedHandler);

Где yourDispatcher - класс, отправляющий настраиваемое событие.

person OXMO456    schedule 15.04.2009
comment
Да, это. На самом деле это очень просто. Я пользуюсь этим все время. Это одно из самых больших преимуществ наследования: вы можете добавлять функциональные возможности, не теряя их. - person Jacob Poul Richardt; 15.04.2009