我们有两个应用程序(不是模块,两个独立的应用程序!):A
和B
。两者都是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
?
答案 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很好地集成在一起。