0

我有一个主要的 flex 应用程序加载的小型 swf as3 flash 应用程序。

主 Flex 应用程序包含一个 SWFLoader,我在 SWFLoader.content 上添加了一个事件侦听器,以获取我准备的自定义事件。

现在每当我喜欢在应用程序中使用该函数dispatchEvent来创建事件并确保事件的气泡参数为真时。所以在这种情况下,事件会在舞台上冒泡,直到它到达我的事件侦听器并且我可以正确处理事件。

当我有一个静态类并且我想从那里分派事件时,问题就存在了。因为它是一个静态类而不是出现在我的舞台上的显示对象,所以它没有冒泡的地方,因此即使在我的主 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"));

谢谢

4

1 回答 1

1

当您创建一个 EventDispatcher 实例并调度它的某些内容时,没有人会收到您的事件,因为没有人可以订阅它。

您必须从显示列表中的某事中分派一个事件。但是您的静态类对显示列表一无所知,也无法访问它。您必须在初始化期间为其提供显示列表中的对象。为此,在加载的 SWF 中,您可以将 someDisplayObject.root 传递给 someDisplayObject 在舞台上的位置。不是 someDisplayObject.stage,因为它会指向容器 Stage,而且可能无法访问。

于 2012-01-30T00:41:03.733 回答