Предоставление Flex MXML рассматривает их зависимости - PullRequest
0 голосов
/ 06 октября 2009

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

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

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

Ответы [ 3 ]

0 голосов
/ 07 октября 2009

Вы не можете заставить людей использовать параметры в конструкторе, но вы можете заставить их установить свойства перед добавлением элемента на сцену.

Как это:

<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>

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

0 голосов
/ 07 октября 2009

В 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).


edit типичная заглушка класса:

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.
    }
}

}
0 голосов
/ 07 октября 2009

Шаблон, который я использовал пару раз, состоял в том, чтобы определить публичный метод init () в MXML, который принимает аргумент, который обычно был бы в конструкторе. Затем, что бы ни создавал экземпляр, этот компонент MXML отвечает за вызов init () перед его использованием.

Другим способом было бы создание сеттеров для свойств, как вы упомянули. В этих установщиках сохраните переданные значения, затем вызовите invalidateProperties () . Затем переопределите метод commitProperties () в MXML и при первом вызове выполните инициализацию (и, возможно, вызовите исключение, если необходимые свойства не были предоставлены). Пока пользователь вашего класса устанавливает все свойства перед добавлением компонента в список отображения, он будет работать нормально (я не верю, что commitProperties () вызывается до тех пор, пока компонент не будет добавлен в отображать список либо путем объявления в MXML, либо путем передачи его в вызов addChild () ).

Я никогда не пробовал этот второй метод (только сейчас думал об этом), но он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...