Предоставление Flex MXML рассматривает их зависимости
Я привык к созданию приложений с использованием чистого AS3. Я всегда передаю зависимости в конструктор создаваемых мной классов, но этот метод, похоже, не подходит для представлений Flex MXML.
Похоже, я должен определить сеттеры в классе MXML, которые сопоставляются с атрибутами в экземпляре тега / класса. Но, используя этот метод, я не могу указать, какие свойства требуются и в каком порядке я ожидаю их и т. Д.
Каков предпочтительный метод, чтобы дать представлению Flex его зависимости?
3 ответа
Во Flex есть несколько вещей, которые вы можете переопределить или прослушать, которые действительно важны.
FlexEvent.CREATION_COMPLETE
- установитьeventListener
для этого (я обычно делаю это в конструкторе, но вы можете сделать это в MXML какcreationComplete
атрибут), и он действует как ваш конструктор. Используйте методы получения и установки для передачи ссылок на ваши зависимости в качестве атрибутов MXML и сохранения их локально, а затем в этом обработчике вы их примените.override protected function createChildren
- вызывается, когда пришло время добавить элементы списка отображения в компонент. Вы не должны делать это во время обработчиков constructor или creationComplete. Всегда соблазнительноaddChild
за пределами этой функции, но лучшие практики Adobe - делать это только непосредственно в этой функции.override protected function updateDisplayList
- здесь должна происходить ваша логика рисования (если есть) или позиционирование / альфа / вращение / и т. д. Это будет вызвано, если изменяется свойство CSS, дочерний объект изменяет размер или положение или что-либо еще, что, по мнению платформы Flex, может привести к необходимости перерисовки экрана. Вы можете заставитьupdateDisplayList
позвонить по телефонуinvalidateDisplayList
override protected function commitProperties
- это вызывается, когда dataProvider для класса изменяется. Любые временные данные внутри компонента означают, что вы хотите обновить внутренние структуры данных, это следует назвать. Вы можете заставить это вызываться с помощьюinvalidateProperties
,FlexEvent.ADDED_TO_STAGE
- Если вам нужно знать, когда компонент фактически добавлен на сцену, вы можете послушать это. На практике я не могу вспомнить когда-либо на самом деле использовать его
Всегда не забывайте звонить super
эквиваленты - если вы забудете это сделать, компонент вообще не появится вообще (это случается со мной как минимум 4 или 5 раз в проекте). Также имейте в виду, что если вы первый invalidateProperties
а потом commitProperties
а потом invalidateDisplayList
а потом updateDisplayList
Вы можете увидеть некоторую вяленость... то есть invalidateDisplayList
как только вы узнаете, вам понадобится перерисовка, чтобы избежать задержки.
Также не стоит слишком инвестировать в Flex 3, так как Flex 4 не за горами, и он немного отличается. У меня есть ощущение, что большая часть этого больше не будет применяться в новой структуре компонентов (имена Spark).
отредактируйте типовую заглушку класса:
package
{
import mx.containers.Canvas;
import mx.events.FlexEvent;
public class TestComponent extends Canvas
{
public function TestComponent()
{
super();
addEventListener(FlexEvent.CREATION_COMPLETE, init);
}
// acts as constructor
private function init(event:FlexEvent):void
{
// might as well be clean
removeEventListener(FlexEvent.CREATION_COMPLETE, init);
// do init stuff here
}
override protected function createChildren():void
{
super.createChildren();
// do any addChilds here that are necessary
}
override protected function commitProperties():void
{
super.commitProperties();
// update internal state when data changes
}
override protected function updateDisplayList(w:Number, h:Number):void
{
super.updateDisplayList(w, h);
// do any drawing, positioning, rotation etc.
}
}
}
Шаблон, который я использовал пару раз, состоял в том, чтобы определить публичный метод init() в MXML, который принимает аргумент, который обычно был бы в конструкторе. Затем, что бы ни создавал этот компонент MXML, он отвечает за вызов init() перед его использованием.
Другой способ - создать сеттеры для свойств, которые вы упомянули. В этих установщиках сохраните переданные значения, затем вызовите invalidateProperties (). Затем переопределите метод commitProperties () в MXML и при первом вызове выполните инициализацию (и, возможно, вызовите исключение, если необходимые свойства не были предоставлены). Пока пользователь вашего класса устанавливает все свойства перед добавлением компонента в список отображения, он будет работать нормально (я не верю, что commitProperties () вызывается до тех пор, пока компонент не будет добавлен в список отображения, либо путем объявлено в MXML или путем передачи его в вызов addChild ().
Я никогда не пробовал этот второй метод (только сейчас думал об этом), но он должен работать.
Вы не можете заставить людей использовать параметры в конструкторе, но вы можете заставить их установить свойства перед добавлением элемента на сцену.
Как это:
<mx:HBox
added="{checkProps()}">
<mx:Script>
<![CDATA[
public var prop1:String;
public var prop2:String;
private function checkProps():void
{
if( !( prop1 && prop2 ) )
{
throw new Error( "Prop1 and prop2 must be set before "+
"adding this to the stage" );
}
}
]]>
</mx:Script>
</mx:HBox>
Реально, если вы заинтересованы в том, чтобы заставить людей что-то делать, прежде чем добавлять это в список отображения, тогда вам все равно придется делать что-то подобное.