Как отправить пользовательское событие из класса actionscript 3 и прослушать его в корне документа? - PullRequest
3 голосов
/ 15 апреля 2009

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

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));

Ответы [ 4 ]

4 голосов
/ 15 апреля 2009

Событие может всплыть только через список отображения, если объект, отправивший событие, является 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));
    }
}
3 голосов
/ 15 апреля 2009

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

0 голосов
/ 15 апреля 2009

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

yourDispatcher.addEventListener (CustomVarEvent.pinClicked, pinClickedHandler);

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

0 голосов
/ 15 апреля 2009

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

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

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

...