invalidate/commitProperties модель, используемая компонентами MXML, очень полезна, по моему опыту, и я хотел бы смочь использовать ее в объектах модели предметной области в моих actionscript приложениях. Как я могу пойти о добавляющих событиях жизненного цикла как этот к моим объектам? Существует ли менеджер по жизненному циклу глобального объекта?
Как отметил Роберт Бак, вы, по сути, предоставлены сами себе, чтобы реализовать такой механизм для компонентов, не относящихся к пользовательскому интерфейсу.
Я нашел эту технику очень полезной для классов моделей, поскольку она может значительно уменьшить "трэшинг" обновлений связанных свойств, когда ваши классы моделей не являются простыми объектами передачи данных - т.е. в них заключена какая-либо логика мультисвойств.
Поскольку мой случай использования относится к объектам модели, мне не нужны все методы 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();
}
}
}
Invalidation и commitProperties не связаны с MXML (вы можете использовать его в качестве компонентов), но они связаны с жизненным циклом компонента с гибким управлением visual (поскольку они единственные, которые необходимо синхронизировать с флеш-кадром покадрового рендеринга). Так что, если вы не говорите о визуальных компонентах, из коробки ничего не получится.
Но если вы хотите реализовать тот же механизм для своих невизуальных классов, вам, вероятно, следует начать с реализации IInvalidating ( docs ) и создания механизма, который вызывает validateNow () , когда необходимо выполнить проверку.
Жизненный цикл Flex Component LifeCycle разработан для обработки создания, разрушения и изменений компонента пользовательского интерфейса в промежутке между ними. Лично я не считаю этот подход подходящим для компонентов, не относящихся к пользовательскому интерфейсу.
Вы можете, если захотите, расширить UIComponent в объектах вашей доменной модели, а затем добавить эту доменную модель в качестве дочерней в контейнер. Тогда он пройдет через фазы проверки Flex Component LifeCycle (commitProperties, updateDisplayList и measure).
Но я бы не рекомендовал такой подход.