分类:
2010-05-19 17:05:01
Parsley允许你建立一个可以动态加载和卸载上下文的层次结构。无论你是否使用FLEX模块,甚至在AS3系统中,这个层次都可以建立。对于Flex模块,parsley只是提供了一个额外的集成接口,可以更容易地处理多种不同ApplicationDomains。
对于较大的应用程序,你可能想将程序划分为模块。在这种情况下,最不幸的是,上下文作为一个整体,在应用程序启动时加载和初始化。即使分割成多个文件的配置如3.6所示结合多种配置机制也不会有任何帮助,因为这些文件会被合并成一个单一的上下文与加载和初始化,就好像它是一个大的配置文件。
另一种功能就派上用场:当创建一个上下文,它可以连接到父上下文。父上下文可能是主上下文,用于在应用程序启动时加载。当加载一个模块时,就得创建子上下文。子上下文的配置文件,你可以通过依赖注入使用父上下文的任何一个对象(但不反之亦然父对象的子上下文任何配置)。消息还可通过上下文边界,取决于你的范围,通过调度。您可以创建嵌套的上下文深层次结构,但往往是结构将是相当平坦,即根上下文和任何子上下文处于同一级。
初始化子上下文可以以二种不同方式:
连接上下文树和视图树Connecting a Context hierarchy to a view hierarchy
当您以ContextBuilder为切入点描述一个视图根,或者当您使用的MXML ContextBuilder,自动使用它们放置在一个视图的根,然后ViewManager将上下文与视图根相关联,这里有二个目的:监听注入到上下文组件的冒泡事件,监听来自其它ContextBuilders的视图低层的冒泡事件。这样,您就不必手动指定父上下文或ApplicationDomain中,该框架将利用这一关心你
或者:
var viewRoot:DisplayObject = ...;
FlexContextBuilder.build(BookStoreConfig, viewRoot);
本例中,新的上下文将视图根自动查找父上下文,并且在视图层次树中监听子上下文。
在某些情况下,你可能要保持上下文层次与视图层次分开。这是采用第二个方案:
手工描述父上下文Manually specifying the parent Context
你能定义一个存在的上下文作为一个新上下文的父类,代码如下:
var parent:Context = ...;
FlexContextBuilder.build(BookStoreConfig, null, parent);
在这种情况下,我们设置视图根参数为空,并且手工指定父类。你也必须意识到,没有视图根,上下文不能自动反射到ApplicationDomain中。所以,如果你没有使用根ApplicationDomain中,而是在一个模块加载的Flex例如子域,你还必须通过域的方法
var parent:Context = ...;
var domain:ApplicationDomain = ...;
FlexContextBuilder.build(BookStoreConfig, null, parent, domain);
另外,没有必要去描述视图根,因为构建器能自动检测父上下文和ApplicationDomain。
如果你加载多个上下文实例作为模块,当你卸载一个模块时,你可能想去掉他们--而不影响父上下文。这很容易,如下所示:
context.destroy();
连接上下文层次结构和视图层次结构很容易。你不用明确销毁上下文,它会自动发生当最后一个视图根与上下文关联的获取从stage删除。ViewManager默认行为是调整上下文生命周期依赖视图的时间。你可以仔细调整ViewManagerFactory的属性去调整这种行为。
当一个上下文销毁,以下行为将出现:
MessageHandler
, MessageBinding
,
MessageInterceptor
or MessageError
ManagedEvents
,它们将被忽略,不再派发任何parsley消息。 在version2.0.x中,框架提供了一个特殊的ContextModule
MXML标签去描述模块的配置信息。这个不再需要了。框架中的ContextModule和ModuleLoader标签已经移除了。现在已完全支持FLEX模块化。你可以用正常的FLEX ModuleLoader加载一个模块或者用Flex
ModuleManager。你既可以在模块内部创建子上下文,而不是在模块组件的根部。如果你象前面演示的那样连接上下文层次树和视图层次树,框架自动选择父上下文和模块的ApplicationDomain。