parsley和swfloader:着名的域传播

时间:2012-02-28 12:50:23

标签: flex swfloader parsley

我们有两个应用程序(不是模块,两个独立的应用程序!):AB。两者都是Parsley管理的,我们想使用SWFLoader在B中嵌入A(但是,我强调,我们不想使用Parsley“连接”这些应用程序,我们只是想要做正常的Flash嵌入)。

这是嵌入代码:

<fx:Script>
<![CDATA[
    [Bindable]
    private var childDomain:ApplicationDomain =
        new ApplicationDomain(ApplicationDomain.currentDomain);

]]>
</fx:Script>

<mx:SWFLoader width="100%" height="100%" source="B.swf" 
    complete="initNestedAppProps(SWFLoader(event.currentTarget).content);"
    loaderContext="{new LoaderContext(false, childDomain, SecurityDomain.currentDomain)}"/>         

当我将B嵌入到没有Parsley的虚拟应用程序中时,它可以正常工作。

但是,当我在实时应用程序A中复制粘贴代码时,Parsley抛出了这个着名的错误:

ReferenceError: Specified ApplicationDomain does not contain the class _B_mx_managers_SystemManager

即使包含嵌入代码的视图不是Parsley配置的(并且没有<Configure/>标记)。

我不能在Parsley论坛上发布这个不幸,谷歌搜索没有帮助,因为似乎人们不经常进行应用程序嵌入。

所以问题是,为什么会发生这种错误(Parsley不应该关心嵌入式应用程序中的内容,是吗?)以及如何告诉Parsley正确使用我的childDomain

2 个答案:

答案 0 :(得分:1)

问题在于Parsley在显示列表中冒泡事件,以便上下文可以使用它们来注入属性等。

尽管您的子应用程序位于单独的应用程序域中,但事件仍然可以从swf加载器的子项冒泡到父级,依此类推。

正在发生的事情是你的子应用程序冒泡的事件正在由shell(或包装器/加载器应用程序)上下文处理,但是当parsley然后尝试反映这个对象时它不能,因为该对象没有存在于它的应用领域。

解决方案是阻止这些事件进入shell应用程序的parsley上下文。您可以通过多种方式执行此操作,例如,您可以只为事件添加侦听器并停止传播。但是,这意味着您必须为所有Parsley事件添加侦听器,这些事件将来可能会发生变化。更好的解决方案是在SWFLoader的父级中创建一个新的上下文,该上下文具有一个autowireFilter,它返回传递给它的displayObjects的ViewAutowireMode.NEVER。

此上下文将阻止它们进一步冒泡并停止反映它们的欧芹,因此可以解决它们不在应用程序域中的问题。

请参阅:org.spicefactory.parsley.core.view.impl.DefaultViewAutowireFilter org.spicefactory.parsley.core.builder.impl.DefaultCompositeContextBuilder http://opensource.powerflasher.com/jira/browse/PSL-587

希望这有帮助。

答案 1 :(得分:0)

上述答案是正确的。

在我们的案例中,我通过编写一个flex模块并使用ModuleLoader而不是SWFLoader解决了这个问题,它与Parsley很好地集成在一起。