通过父应用程序在模块之间传递自定义事件

Posted

技术标签:

【中文标题】通过父应用程序在模块之间传递自定义事件【英文标题】:passing custom events between modules through parent application 【发布时间】:2012-11-25 02:36:06 【问题描述】:

我创建了一个自定义事件,我想用它在两个模块之间传递一个字符串。事件如下所示:

package com.mypackage.events

import flash.events.Event;

public class ThumbDeleteEvent extends Event

    public static const THUMBS_DELETED:String = "thumbsDeleted";

    public var files:String;

    public function ThumbDeleteEvent(type:String, files:String)
    
    super(type);
    this.files = files;
    

    // Override the inherited clone() method.
    override public function clone():Event 
    return new ThumbDeleteEvent(type, files);
    



在一个模块中,我像这样调度事件:

parentApplication.dispatchEvent(new ThumbDeleteEvent("parentApplication.thumbsDeleted", files));

在另一个模块中,我像这样监听事件:

public function init():void 
    parentApplication.addEventListener("parentApplication.thumbsDeleted", onThumbsDelete);
    

如果我使用 ThumbsDeleteEvent 作为传入侦听器函数的类型,如下所示:

public function onThumbsDelete(evt:ThumbDeleteEvent):void
 trace("thumb delete event for thumbs: "+evt.files);

我收到以下错误:

TypeError: Error #1034: Type Coercion failed: cannot convert  com.mypackage.events::ThumbDeleteEvent@26748a31 to com.mypackage.events.ThumbDeleteEvent.

如果我只是使用 Event 作为传入侦听器函数的类型,如下所示:

public function onThumbsDelete(evt:ThumbDeleteEvent):void
if(evt is ThumbDeleteEvent)
    trace("thumb delete event for thumbs: "+(evt as ThumbDeleteEvent).files);
else
    var type:XML = describeType(evt);
    trace(type.toXMLString());


它工作但不认为它是 ThumbDeleteEvent 类型类(它命中 else 语句)描述类型的 xml 输出说它的类型是:

type name="com.mypackage.events::ThumbDeleteEvent" 

这里发生了什么?如果我在调试器中放置一个断点,它会说事件是 ThumbDeleteEvent,我可以看到 files 参数及其正确性???

【问题讨论】:

我看不出你在做什么有什么问题。您是否尝试过清理项目或关闭并重新启动 IDE(有时在 Flex/FlashBuilder 中工作)?如果没有,请尝试重命名该类。 是的,我已经尝试了我能想到的一切,清理项目重新启动 IDE,重命名类,以我能想到的各种方式投射对象——我已经准备好开始扔东西了。我想要的数据就在那儿,当我在调试器中设置断点时我可以看到它,我就是无法得到它!!!! 对于比我更了解 actionscript 的人来说可能有意义的一条线索是 - 如果我对我的对象执行 describeType,我会得到:type name="com.mypackage. events::ThumbDeleteEvent" 如果我​​描述任何其他对象,例如我得到的字符串: type name="String" 它没有完整路径和 ::,我真的只是想我需要知道到底是什么我应该将它转换为类似 (evt as com.mypackage.events::ThumbDeleteEvent) 的东西,这显然不起作用,但必须有某种方法可以到达对象。 这可能是一个无知的问题,但事件在两个位置“导入”的方式是否相同? 如果您将它作为“事件”传递,但在收到时将其转换为您的事件类型,会发生什么? 【参考方案1】:

这里的问题是一个 swf 有自己对该类的定义,然后另一个 swf 有自己的版本,该类完全相同。当尝试在它们之间进行转换时,flash 会进行字节码检查以查看定义是否相同,如果您曾经在文件中更改了某些内容而没有使用完全相同的信息更新两者,您将遇到此问题。即编译两个swf文件,然后在as文件中换一个空格,只编译一个swf文件。

呃,我又回来了,所有这些问题都与不同模块之间的共享代码有关。我总是不停地解决这些错误,直到我让它工作,并且永远无法真正记住它是什么,因为它可能是很多问题。

确保两个已编译的 swf 文件都具有文件的最新版本。 确保两个 swf 文件与代码文件具有相同的链接嵌套。

如果这不起作用[记不清了,因为这个问题有点像解决一次并复制到其他所有项目]。

查看将内容添加到 ApplicationDomain 的顺序,并通过在 Flash 库中导入的内容确保没有其他内容具有自己的过期版本 将共享代码移动到使用“动态绑定”链接的单独代码库中 尝试改为共享界面 更改资产加载到 ApplicationDomain 的方式

希望有人对这个问题有更多的了解,并且可以准确地说明要使用哪些步骤,但这至少是一个起点......我可能有更多时间研究这个问题,并在以后的某个时间写一篇关于它的帖子今天。


编辑: 来自另一个 SO 线程 Custom AS3 Class not Updating

这是一个古老的问题,最终归结为验证错误。当您在一个或多个应用程序、模块、swf 等中嵌入“A 类”时,就会发生这种情况。最终,当“A 类”发生更改时,必须重新编译使用“A 类”的每个输出 swf。否则,您最终会遇到 1 个模块具有较新实现而其他模块没有的情况。当应用程序域遇到同名/包的类时,应用程序域被定义为“首先获胜”,这使这个问题更加复杂 - 这意味着如果首先引用旧的,则稍后加载的新的将被忽略。

更持久的解决方案是对 RSL 使用类提升,最终允许 RSL 控制实际的“A 类”引用,在该引用中它还实现所有模块使用的“IClassAImpl”接口。这允许编译器将引用与它知道的签名交叉链接,而无需实际嵌入实际的类本身。

【讨论】:

来自另一个 *** 线程:***.com/questions/13352176/…

以上是关于通过父应用程序在模块之间传递自定义事件的主要内容,如果未能解决你的问题,请参考以下文章

Vue-组件自定义事件

vue组件-子组件向父组件传递数据-自定义事件

Vue父子组件间通信(数据传递)

有没有办法通过自定义事件传递额外的数据?

父子组件信息传递(子传父)

vue-自定义组件传