Есть ли способ добавить жизненный цикл valueCommit к не-mxml компонентам в Actionscript? - PullRequest
1 голос
/ 06 июля 2010

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

Ответы [ 3 ]

1 голос
/ 06 июля 2010

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

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

1 голос
/ 07 июля 2010

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

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

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

}
0 голосов
/ 06 июля 2010

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

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

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

...