Apache flex 是否有任何方法可以向Actionscript中的非mxml组件添加valueCommit生命周期?
根据我的经验,mxml组件使用的invalidate/commitProperties模型非常有用,我希望能够在actionscript应用程序的域模型对象中使用它。我如何才能将这样的生命周期事件添加到我的对象中?是否有全局对象生命周期管理器?Flex组件生命周期旨在处理用户界面组件的创建、销毁和其间的更改。一、 就个人而言,不要认为这种方法适合非用户界面组件 如果需要,可以在域模型对象中扩展UIComponent,然后将该域模型作为子对象添加到容器中。然后它将经历Flex组件生命周期验证阶段(commitProperties、updateDisplayList和measure)Apache flex 是否有任何方法可以向Actionscript中的非mxml组件添加valueCommit生命周期?,apache-flex,actionscript-3,actionscript,flex3,Apache Flex,Actionscript 3,Actionscript,Flex3,根据我的经验,mxml组件使用的invalidate/commitProperties模型非常有用,我希望能够在actionscript应用程序的域模型对象中使用它。我如何才能将这样的生命周期事件添加到我的对象中?是否有全局对象生命周期管理器?Flex组件生命周期旨在处理用户界面组件的创建、销毁和其间的更改。一、 就个人而言,不要认为这种方法适合非用户界面组件 如果需要,可以在域模型对象中扩展UIComponent,然后将该域模型作为子对象添加到容器中。然后它将经历Flex组件生命周期验证阶段(
但是,我不建议这样做 无效和提交属性未链接到MXML(您可以将其用作组件),但它链接到flex managedvisual组件生命周期(因为它们是唯一需要与flash逐帧渲染同步的组件)。因此,除非你谈论的是视觉组件,否则它不会开箱即用
但是,如果您希望为非可视类实现相同的机制,那么您应该首先实现IInvalidating()并创建一个机制,在需要进行验证时调用validateNow()函数。正如Robert Bak所指出的,对于非UI组件,您基本上可以自己实现这种机制 我发现这是一种在模型类上使用的非常有用的技术,因为当您的模型类不是简单的数据传输对象时,它可以极大地减少绑定属性更新的“抖动”——也就是说,它们包含任何类型的多属性逻辑 因为我的用例是针对模型对象的,所以我不需要所有的IIN验证方法 以下是我的具体实现,作为您自己努力的起点。请注意,这来自于我们使用的名为RAFModel的“基本模型类”,这是用于Flex4SDK的
// INVALIDATION AND COMMITPROPERTIES PATTERN
private var invalidatePropertiesFlag:Boolean;
public function invalidateProperties():void
{
if (!invalidatePropertiesFlag)
{
invalidatePropertiesFlag = true;
invalidateModelObject(this);
}
}
protected function commitProperties():void
{
// override this
}
// -- INVALIDATION SUPPORT
public static var invalidObjects:Dictionary = new Dictionary(true);
public static var validatePending:Boolean = false;
public static function invalidateModelObject(obj:RAFModel):void
{
invalidObjects[obj] = true;
if (!validatePending)
{
validatePending = true;
FlexGlobals.topLevelApplication.callLater(validateObjects);
}
}
protected static function validateObjects():void
{
var invalidQueue:Dictionary = invalidObjects;
// start a fresh tracker for further invalidations
// that are a side effect of this pass
invalidObjects = new Dictionary(true);
// ready to receive another call
validatePending = false;
for (var o:* in invalidQueue)
{
var rm:RAFModel = o as RAFModel;
if (rm)
{
// clear the flag first, in case we're reentrant
// on any given instance
rm.invalidatePropertiesFlag = false;
rm.commitProperties();
}
}
}