Предоставление Flex MXML рассматривает их зависимости

Я привык к созданию приложений с использованием чистого AS3. Я всегда передаю зависимости в конструктор создаваемых мной классов, но этот метод, похоже, не подходит для представлений Flex MXML.

Похоже, я должен определить сеттеры в классе MXML, которые сопоставляются с атрибутами в экземпляре тега / класса. Но, используя этот метод, я не могу указать, какие свойства требуются и в каком порядке я ожидаю их и т. Д.

Каков предпочтительный метод, чтобы дать представлению Flex его зависимости?

3 ответа

Во Flex есть несколько вещей, которые вы можете переопределить или прослушать, которые действительно важны.

  1. FlexEvent.CREATION_COMPLETE - установить eventListener для этого (я обычно делаю это в конструкторе, но вы можете сделать это в MXML как creationComplete атрибут), и он действует как ваш конструктор. Используйте методы получения и установки для передачи ссылок на ваши зависимости в качестве атрибутов MXML и сохранения их локально, а затем в этом обработчике вы их примените.
  2. override protected function createChildren - вызывается, когда пришло время добавить элементы списка отображения в компонент. Вы не должны делать это во время обработчиков constructor или creationComplete. Всегда соблазнительно addChild за пределами этой функции, но лучшие практики Adobe - делать это только непосредственно в этой функции.
  3. override protected function updateDisplayList - здесь должна происходить ваша логика рисования (если есть) или позиционирование / альфа / вращение / и т. д. Это будет вызвано, если изменяется свойство CSS, дочерний объект изменяет размер или положение или что-либо еще, что, по мнению платформы Flex, может привести к необходимости перерисовки экрана. Вы можете заставить updateDisplayList позвонить по телефону invalidateDisplayList
  4. override protected function commitProperties - это вызывается, когда dataProvider для класса изменяется. Любые временные данные внутри компонента означают, что вы хотите обновить внутренние структуры данных, это следует назвать. Вы можете заставить это вызываться с помощью invalidateProperties,
  5. 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>

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

Другие вопросы по тегам