3

我正在尝试将自定义事件从一个弹性模块分派到另一个。

调度事件的代码如下

Application.application.Destination.child.dispatchEvent(
    new AlgoEvent(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));

这里 AlgoEvent 是一个自定义事件

另一方面,捕获和处理事件的模块具有以下代码:

public  function sendParametersToChild(e:AlgoEvent):void
{
    //some codes
}

但是当执行该语句时Application.application.Destination.child.dispatchEvent(new AlgoEvent(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));,调试器会给出以下运行时异常:

TypeError: Error #1034: Type Coercion failed: cannot convert resources.events::AlgoEvent@4182239 to resources.events.AlgoEvent.
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
    at components::Destination/sendTimeToChild()[E:\FlexProjects\MyApp\src\components\Destination.mxml:99]
    at components::Destination/updateParameters()[E:\FlexProjects\MyApp\src\components\Destination.mxml:206]
    at components::Destination/__CreateBasketButton_click()[E:\FlexProjects\MyApp\src\components\Destination.mxml:558]

我无法确定这里出了什么问题。请帮忙解决这个问题

这是我的活动课

public class AlgoEvent extends Event
{
    public static const GETFROMPARENT_LOCAL_EVENT:String = "getfromparent_local";
    private var eventType:String;

    public function AlgoEvent(eventType:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(eventType,bubbles,cancelable);
        this.eventType=eventType;
    }
}

调试时在 UIComponent 类的这个函数中出现错误

override public function dispatchEvent(event:Event):Boolean
{
    if (dispatchEventHook != null)
        dispatchEventHook(event, this);

    return super.dispatchEvent(event); 
}

正是这一行给出了错误:dispatchEventHook(event, this);

4

7 回答 7

3

AlgoEvent在主应用程序中导入类创建对它的引用。

import resources.events.AlgoEvent;
private var dummyEvent: AlgoEvent;

可以在此处找到对此的一些解释:模块域

如果您的自定义事件不带有任何特殊事件属性,您可以使用标准Event类来解决您的问题。

dispatchEvent(new Event(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));
于 2011-03-23T07:35:23.873 回答
2

我在调度时遇到了同样的问题,解决了覆盖两个函数:

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

override public function toString():String
{
        return formatToString("AlgoEvent","type"","bubbles","cancelable","eventPhase");
}

希望它有所帮助:)

于 2011-05-14T03:50:29.500 回答
1

splash 先生提出了一个对我有用的解决方案:

尝试让主应用程序知道 Custum Event(在我的例子中是 Algo Event)类。

即在主应用程序中导入它并创建它的一个变量..

它的工作原理有一个主要原因>>当我们尝试使用事件分派在模块之间进行通信时,发生的情况是:模块在运行时加载,但事件类等类在运行时链接到模块。但是在加载模块之前编译 Event 类..

应用程序在编译时定义了一个自定义事件类,模块在发布时定义了自己的自定义事件类。然后当应用程序运行时,应用程序中调度的自定义事件类与模块 swf 中的不匹配。

对于导致此错误的问题,可以检查链接:

http://www.kirupa.com/forum/showthread.php?t=320390

并且

http://www.jeffdepascale.com/index.php/flash/custom-events-in-loaded-swf-files/

于 2011-03-23T10:41:21.140 回答
0

Mate 框架负责这一切。它为您的应用程序中的所有模块提供了一个全局事件总线。 http://mate.asfusion.com/

于 2011-03-23T06:20:33.760 回答
0

尝试在您的自定义事件、AlgoEvent 中覆盖 clone() 方法。将以下代码添加到您的 AlgoEvent.as 类并尝试:

覆盖公共函数 clone():Event{ return new AlgoEvent(eventType,bubbles,cancelable); } HTH。

于 2011-03-23T08:31:23.450 回答
0

您的自定义事件类应如下所示:

public class AlgoEvent extends Event
{
    public static const GETFROMPARENT_LOCAL_EVENT:String = "getfromparent_local";

    public function AlgoEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
    };

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

您应该使用 Event 的继承类型属性,而不是创建一个新的。

此外,UIComponent它有自己的dispatchEvent方法,因此您不必创建自己的方法 - 前提是它与继承的方法不同。

问候, 罗伯

于 2011-03-23T10:29:16.377 回答
-1

好的,必须说,从架构的角度来看,您正在做的事情是错误的。由于很多原因,调用 Application.application 是不好的,尤其是当您开始向下显示树时。第二个任何子项发生更改,您的构建现在已损坏,并且您直到运行时才知道这一点,因为它是一个模块。

您需要的是一个应用程序框架。一种在不降低可维护性的情况下增加复杂性的方法。那里有很多,但我个人最喜欢的是欧芹。我已经在许多非常大的项目中使用它并取得了很大的成功。您现在尝试解决的问题,即在另一个模块监听它的地方分派一个事件,是非常微不足道的(可以在大约 3 行代码中完成)。

我建议您查看它以及我关于欧芹介绍的演示文稿

于 2011-03-23T18:12:58.593 回答