Там какой-либо путь состоит в том, чтобы добавить valueCommit жизненный цикл к некомпонентам MXML в Actionscript?

invalidate/commitProperties модель, используемая компонентами MXML, очень полезна, по моему опыту, и я хотел бы смочь использовать ее в объектах модели предметной области в моих actionscript приложениях. Как я могу пойти о добавляющих событиях жизненного цикла как этот к моим объектам? Существует ли менеджер по жизненному циклу глобального объекта?

1
задан Chris R 6 July 2010 в 15:01
поделиться

3 ответа

Как отметил Роберт Бак, вы, по сути, предоставлены сами себе, чтобы реализовать такой механизм для компонентов, не относящихся к пользовательскому интерфейсу.

Я нашел эту технику очень полезной для классов моделей, поскольку она может значительно уменьшить "трэшинг" обновлений связанных свойств, когда ваши классы моделей не являются простыми объектами передачи данных - т.е. в них заключена какая-либо логика мультисвойств.

Поскольку мой случай использования относится к объектам модели, мне не нужны все методы 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();
        }
    }

}
1
ответ дан 2 September 2019 в 23:15
поделиться

Invalidation и commitProperties не связаны с MXML (вы можете использовать его в качестве компонентов), но они связаны с жизненным циклом компонента с гибким управлением visual (поскольку они единственные, которые необходимо синхронизировать с флеш-кадром покадрового рендеринга). Так что, если вы не говорите о визуальных компонентах, из коробки ничего не получится.

Но если вы хотите реализовать тот же механизм для своих невизуальных классов, вам, вероятно, следует начать с реализации IInvalidating ( docs ) и создания механизма, который вызывает validateNow () , когда необходимо выполнить проверку.

1
ответ дан 2 September 2019 в 23:15
поделиться

Жизненный цикл Flex Component LifeCycle разработан для обработки создания, разрушения и изменений компонента пользовательского интерфейса в промежутке между ними. Лично я не считаю этот подход подходящим для компонентов, не относящихся к пользовательскому интерфейсу.

Вы можете, если захотите, расширить UIComponent в объектах вашей доменной модели, а затем добавить эту доменную модель в качестве дочерней в контейнер. Тогда он пройдет через фазы проверки Flex Component LifeCycle (commitProperties, updateDisplayList и measure).

Но я бы не рекомендовал такой подход.

0
ответ дан 2 September 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: