根据我的经验,mxml组件使用的invalidate / commitProperties模型非常有用,我希望能够在我的actionscript应用程序中的域模型对象中使用它。如何将这样的生命周期事件添加到我的对象中?是否有全局对象生命周期管理器?
答案 0 :(得分:1)
失效和commitProperties没有链接到MXML(您可以将其作为组件使用),但它链接到flex托管 可视 组件生命周期(因为它们是唯一需要通过帧渲染与闪存帧同步的那些)。因此,除非您在谈论视觉组件,否则它将无法开箱即用。
但是如果你想为非可视类实现相同的机制,你应该首先实现IInvalidating(docs)并创建一个调用 validateNow()的机制在需要验证时运行。
答案 1 :(得分:1)
正如Robert Bak所指出的,你基本上可以自己为非UI组件实现这样的机制。
我发现这是一种非常有用的技术,可用于模型类,因为当模型类不是简单的数据传输对象时,它可以显着减少绑定属性更新的“颠簸” - 即它们具有任何类型的多重 - 封装在其中的属性逻辑。
由于我的用例是模型对象,因此我不需要IInvalidating的所有方法。
这是我的特定实施,作为您自己努力的起点。请注意,这来自我们使用的称为RAFModel的“基础模型类”,这适用于Flex 4 SDK。
// 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();
}
}
}
答案 2 :(得分:0)
Flex Component LifeCycle旨在处理用户界面组件在两者之间的创建,销毁和更改。我个人认为,这种方法并不适用于非用户界面组件。
如果需要,您可以在域模型对象中扩展UIComponent,然后将该域模型作为子项添加到容器中。然后它将通过Flex组件LifeCycle验证阶段(commitProperties,updateDisplayList和measure)。
但是,我不建议采用这种方法。