событие отправки с пузырьками в классе, которые не появляются на сцене - PullRequest
0 голосов
/ 29 января 2012

У меня есть небольшие flash-приложения sw3 as3, которые загружаются основным flex-приложением.

Основное приложение Flex содержит SWFLoader, и я добавил прослушиватель событий на SWFLoader.content для выборки пользовательских событий, которые я подготовил.

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

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

Я пытался использовать eventDispatcher со следующим кодом:

            new EventDispatcher().dispatchEvent(new CustomEvent(CustomEvent.EVENT_setAttribute,{'attr_name':attrName,'attr_val':attrVal)));

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

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

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

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

любая информация будет принята с благодарностью.

это мой пользовательский класс событий:

public class CustomEvent extends Event
{
    public var command:String;
    public var params:Object;
    public static const CONTROL_TYPE:String = "eMyControl";


    private static var EVENT_setAttribute:String = "set_attribute";

    private static var gameAttributes:Object = new Object();

    public static function setAttribute(attrName:String,attrVal:String):void {
        gameAttributes[attrName]=attrVal;

        new EventDispatcher().(new XpoEvent(XpoEvent.EVENT_setAttribute,{'attr_name':attrName,'attr_val':attrVal}));
    }

    public function CustomEvent(eventName:String, params:Object = null, bubbles:Boolean = true, cancelable:Boolean = false)
    {
        var _loc_6:String = null;
        var _loc_5:String = "";
        if (params != null)
        {
            _loc_5 = "params: ";
            for (_loc_6 in params)
            {

                _loc_5 = _loc_5 + (_loc_6 + "=" + params[_loc_6] + " ");
            }
        }
        trace("CustomEvent issued - " + eventName + " " + _loc_5);
        super(CONTROL_TYPE, bubbles, cancelable);
        this.command = eventName;
        if (params != null)
        {
            this.params = params;
        }
        return;
    }

}

Как вы можете видеть здесь, у меня есть статическая функция setAttribute, которая передает attrName и Val в массив, а затем отправляет пользовательское событие. по умолчанию для события пользовательского класса включены пузырьки. кажется, что из-за того, что я не отправил событие, используя объект, который появляется на сцене, я не могу из основного приложения flex правильно перехватить событие.

работает следующий код:

  <object In Stage>.dispatchEvent(new CustomEvent("testme"));

спасибо

1 Ответ

1 голос
/ 30 января 2012

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

Вы должны отправить событие из чего-то, что есть в списке отображения. Но ваш статический класс ничего не знает о списке отображения, он может получить к нему доступ. Вы должны предоставить объект в списке отображения для него во время инициализации. Для этого в загруженном SWF вы можете передать someDisplayObject.root, где someDisplayObject находится на сцене. Не someDisplayObject.stage, поскольку он будет указывать на контейнерную сцену, а более того может оказаться недоступным.

...