0

我有以下自定义事件:

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);执行后能够使用的值。

查尔斯的截图

我已经为此工作了几个小时,查看博客和论坛帖子,但无法找到可行的解决方案。理想情况下,代码示例会很好,但现在任何帮助都将不胜感激。

4

2 回答 2

0

更重要的问题可能是您如何收听活动?由于您是从弹出窗口中分派事件,因此我假设您正试图在弹出窗口范围之外访问此事件。

重要的是要考虑以下几点:

通常,事件的工作方式与您预期的一样,但有一种变化:来自弹出窗口的事件不会沿着继承链传递到主应用程序根。

相反,从弹出窗口调度的事件在窗口根处终止。这是因为弹出管理器是弹出窗口的父级。

因此,在弹出窗口中启动的事件不会冒泡到主应用程序页面,主应用程序页面是主应用程序中任何对象的最终父级。

Flex 应用程序中的弹出窗口不是应用程序容器的子项,而是 SystemManger 的子项。

这意味着如果您只是发送一个事件,它只会到达系统管理器,并且任何试图在应用程序层次结构中侦听较低级别的东西(即:一切)都不会收到这个。

这个问题有很多解决方案,并且根据您的架构(首选框架词(欧芹,robotlegs))进行更改,但是现在如果您只是向 Application.application.systemManager 添加一个侦听器,您应该会收到该事件:

Application.application.systemManager.addEventListener(EventConstants.CREATE_ALBUM_FOLDER, [YOUR HANDLER]);

您可能还需要在调度事件时对事件进行冒泡。

但是,这不是处理来自弹出窗口的事件的理想解决方案,您可能需要考虑将模型注入您的弹出窗口并让它们发布消息。

希望有帮助

于 2012-06-15T20:09:13.847 回答
0

您需要覆盖子类中的 Event.clone() 方法。clone() 方法通过设置类型属性和克隆中的任何新属性返回事件对象的克隆副本。通常,您定义 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;
        }
    }
}
于 2012-06-16T13:03:37.223 回答