Получение результатов от dispatchEvent во Flex 3

У меня есть следующее настраиваемое событие:

package com.un.photoManager.events
{
import flash.events.Event;

import mx.collections.ArrayCollection;


public class CreateAlbumFolderEvent extends Event
{
    // when creating an album, we need to know which albumfolder to put it in, 0 is the default group;
    public var albumFolderID:int = 0;
    public var name:String;

    public function CreateAlbumFolderEvent(type:String, name:String, albumFolderID:int = 0, cancelable:Boolean = false)
    {
        super(type, true, cancelable);
        this.name = name;
        this.albumFolderID = albumFolderID;

    }

}
}

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

protected function handleCreate():void
        {
            var event:CreateAlbumFolderEvent;
            var selectedItemType:String;

            if (folderAlbum == CREATE_ALBUM)
            {
                event = new CreateAlbumFolderEvent(EventConstants.CREATE_ALBUM, newAlbumFolder.text, selectedAlbumFolderID);
                selectedItemType = "Album";
            }
            else
            {
                event = new CreateAlbumFolderEvent(EventConstants.CREATE_ALBUM_FOLDER, newAlbumFolder.text);
                selectedItemType = "Folder";
            }
            dispatchEvent(event);
            FolderBrowse.lastSelectedItemType = selectedItemType;
            PopUpManager.removePopUp(this);
        }

Что я пытаюсь сделать, так это уловить ответ, который возвращается. Вот скриншот, на котором Чарльз показывает ответ. Значение Result - это то, что я хочу использовать после выполнения dispatchEvent(event);.

Скриншот Чарльза

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


person Chris    schedule 15.06.2012    source источник


Ответы (2)


Вам необходимо переопределить метод Event.clone () в своем подклассе. Метод clone () возвращает клонированную копию объекта события, задав свойство type и любые новые свойства в клоне. Обычно вы определяете метод clone () для возврата экземпляра события, созданного с помощью оператора new.

package sample
{
    import flash.events.Event;
    import mx.collections.ArrayCollection;

    public class CustomEvent extends Event
    {

        public static var DATA_LOADED:String = "dataLoaded";

        private var _data:ArrayCollection;

        public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, data:ArrayCollection=null)
        {
            super(type, bubbles, cancelable);
            _data = data;
        }

        override public function clone():Event
        {
            return new CustomEvent(type, bubbles, cancelable, data);
        }

        public function get data():ArrayCollection
        {
            return _data;
        }
    }
}
person Lucas Matos    schedule 16.06.2012

er

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

Важно учитывать следующее:

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

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

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

Всплывающие окна в приложении Flex не являются дочерними по отношению к контейнеру приложения, а являются дочерними элементами SystemManger.

Это означает, что если вы просто отправляете событие, оно будет ТОЛЬКО ВСЕГДА ДОСТУПАТЬ к системному администратору, и все, что пытается прослушивать ниже в иерархии приложений (то есть все), не получит его.

Есть много решений этой проблемы, которые меняются в зависимости от вашей архитектуры (предпочтительные фреймворки (петрушка, робот-ножки)), но сейчас, если вы просто добавите слушателя в Application.application.systemManager, вы должны получить событие:

Application.application.systemManager.addEventListener (EventConstants.CREATE_ALBUM_FOLDER, [ВАШ ОБРАБОТЧИК]);

вам также может потребоваться BUBBLE для события при его отправке.

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

надеюсь, это поможет

person MonkeyMagiic    schedule 15.06.2012