根据我的经验,mxml组件使用的invalidate/commitProperties模型非常有用,我希望能够在我的actionscript应用程序的域模型对象中使用它。我该如何向我的对象添加这样的生命周期事件呢?是否有全局对象生命周期管理器?
发布于 2010-07-07 09:29:29
正如Robert Bak所指出的,为非UI组件实现这样一种机制基本上是您自己的事。
我发现这是一个在模型类上使用的非常有用的技术,因为当你的模型类不是简单的数据传输对象时,它可以极大地减少绑定属性更新的“颠簸”--也就是说,它们内部封装了任何类型的多属性逻辑。
因为我的用例是模型对象,所以我不需要IInvalidating的所有方法。
下面是我的具体实现,作为您自己工作的起点。请注意,这来自我们使用的名为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();
}
}
}发布于 2010-07-06 23:21:39
无效和commitProperties没有链接到MXML (您可以将其与组件一起使用),但它链接到了flex visual组件生命周期(因为它们是唯一需要与flash逐帧渲染同步的组件)。因此,除非你谈论的是可视化组件,否则它不会开箱即用。
但是,如果您希望为非可视化类实现相同的机制,则可能应该从实现IInvalidating (docs)开始,并创建一种在需要完成验证时调用validateNow()函数的机制。
发布于 2010-07-06 23:20:34
Flex组件LifeCycle旨在处理用户界面组件的创建、销毁和在此期间的更改。就我个人而言,我认为这种方法不适合非用户界面组件。
如果需要,您可以在域模型对象中扩展UIComponent,然后将该域模型作为子对象添加到容器中。然后,它将经历Flex组件LifeCycle验证阶段(commitProperties、updateDisplayList和measure)。
但是,我不推荐这种方法。
https://stackoverflow.com/questions/3187417
复制相似问题