0

我们有两个应用程序(不是模块,两个独立的应用程序!):AB. 两者都是 Parsley 管理的,我们希望使用 SWFLoader 嵌入BA但是,我强调,我们不想使用 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 正确使用 my childDomain?

4

2 回答 2

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

希望这可以帮助。

于 2012-03-30T12:16:23.280 回答
0

上面的答案是正确的。

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

于 2012-04-03T09:24:40.797 回答