有没有办法在Actionscript中的非mxml组件中添加valueCommit生命周期?

时间:2010-07-06 15:01:55

标签: flex actionscript-3 actionscript flex3

根据我的经验,mxml组件使用的invalidate / commitProperties模型非常有用,我希望能够在我的actionscript应用程序中的域模型对象中使用它。如何将这样的生命周期事件添加到我的对象中?是否有全局对象生命周期管理器?

3 个答案:

答案 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)。

但是,我不建议采用这种方法。