Apache flex 如何访问已加载SWF的公共属性和方法

Apache flex 如何访问已加载SWF的公共属性和方法,apache-flex,actionscript-3,actionscript,Apache Flex,Actionscript 3,Actionscript,如何调用actionscript中加载的SWF的公共属性和方法 多年来,我一直在使用stackoverflow来回答编程问题,所以我想通过编写一本指南来回馈我,这本指南是关于一个我很难理解的问题。这是我的第一本用户指南,请告诉我是否有什么可以改进的地方。我不同意你的方法。在我看来,这是“黑客的”。您与加载的主权财富基金的沟通有限是有原因的,因为您不知道它们在做什么,也不知道应该如何管理它们 如果您想从体系结构的角度进行讨论,那么这是尝试访问信息的一种非常糟糕的方式。主应用程序不必访问加载的swf

如何调用actionscript中加载的SWF的公共属性和方法


多年来,我一直在使用stackoverflow来回答编程问题,所以我想通过编写一本指南来回馈我,这本指南是关于一个我很难理解的问题。这是我的第一本用户指南,请告诉我是否有什么可以改进的地方。

我不同意你的方法。在我看来,这是“黑客的”。您与加载的主权财富基金的沟通有限是有原因的,因为您不知道它们在做什么,也不知道应该如何管理它们


如果您想从体系结构的角度进行讨论,那么这是尝试访问信息的一种非常糟糕的方式。主应用程序不必访问加载的swf中的属性。如果您正在构建一个大型应用程序,并且加载的swf(可能是一个模块?)需要主应用程序所拥有的信息,那么您应该研究一个应用程序框架,如Parsley,它进行依赖注入,以提供加载的swf所需的数据。这是一种更干净的方法,并且在体系结构上是合理的。

flash引擎更强大的功能之一是能够通过使用Loader类在flash程序中加载flash程序。不幸的是,与加载程序的通信受到限制。虽然可以建立LocalConnection对象,但它可以安全支持的通信量是有限的

一个简单的解决方案是在主程序的安全域中加载SWF文件。这样做的好处是将加载的SWF的公共方法和属性公开给加载程序,反之亦然

首先扩展Loader类,该类将用于与加载的文件交互

public class ParentChildLoader extends Loader
接下来,我们必须将SWF文件存储为ByteArray。变量路径是系统上的文件路径。对于http url,可以使用URLStream对象而不是FileStream

var swfBytes:ByteArray = new ByteArray();
var file:File = new File(path);
if (file.exists)
{
    var loadStream:FileStream = new FileStream();
    loadStream.open(file, FileMode.READ);
    loadStream.readBytes(swfBytes);
    loadStream.close();
}
现在我们已经将SWF存储为ByteArray,我们将SWF加载到安全域中并侦听完整事件

var context:LoaderContext = new LoaderContext();
context.allowLoadBytesCodeExecution = true;
addEventListener(Event.COMPLETE, onSwfLoad);
loadBytes(swfBytes, context);
如果要从加载程序访问加载的SWF的属性,请使用content属性

Object(this.content).foo(bar);
Object(this.content).a = b;
Object(this.parent).foo(bar);
Object(this.parent).a = b;
如果要从SWF访问加载程序的公共属性,请使用父属性

Object(this.content).foo(bar);
Object(this.content).a = b;
Object(this.parent).foo(bar);
Object(this.parent).a = b;

这有许多实际应用,从允许通用函数的可重用性到减轻创造性团队的一些编程负担。注意事项;加载的SWF存在于主程序的安全域中,因此关键是您只能加载使用此方法信任的文件。

更干净的方法是使用接口。这里有一个例子。由两个项目组成。项目1(PluginLoader)是您的基础应用程序。本项目的一部分包括AS3接口:

/* IPlugin.as */
package
    {
        public interface IPlugin
        {
            function getID():String;
            function doStuff():void;
        }
    } 
然后,在第二个项目(TestPlugin)中加载的swf实现了以下接口:

package
{
    import flash.display.Sprite;

    public class TestPlugin extends Sprite implements IPlugin
    {
        private const _ID:String = "TestPlugin";

        public function getID():String {
            return _ID;
        }

        public function doStuff():void {

            trace('Test plugin: Doing Stuff');
        }
    }
}
该接口将通过源文件或swc包含在该项目中

然后加载它(回到PluginLoader项目中):


欣赏这种情绪。:)不过,我相信,与发布“用户指南”不同,人们接受的做法是提出问题,然后发布自己的答案。此外,本指南仅适用于AIR->File和FileTeam都是AIR-only类。尝试将数据格式设置为URLLoaderDataFormat.BINARYYeah,用URLLoader替换。我建议将此作为一个问题重新编写,然后将您的解决方案作为答案发布。谢谢您对我的格式提出的建议。我还提到,您可以使用URLStream而不是FileStream.+1来重新设计您的问答方法。在大多数情况下,我同意您的看法。我开发这个的原因是为了从一组创造性的设计师中消除编写代码的需要。基本上,它提供了一个API函数,他们可以从广告内容(即动态提要)中调用这些函数,而不必担心导入库。同样,我们可以在不重新编译内容的情况下更新函数的行为。这种方法是否适用于Creative Studio中创建的SWF文件?Hrm我将不得不研究它。该系统的全部目的是减轻创意团队的编程负担。使用swc模块会更谨慎吗?我不想在内容中添加函数库。我希望内容直接与加载器对话。我研究了你的解决方案,实际上与我需要做的相反。我不需要加载程序访问内容的功能。我需要家长的内容访问功能。