Где «новый» вписывается в цикл создания гибких? - PullRequest
0 голосов
/ 26 мая 2010

В следующем коде вызов myChild.bar () приводит к исключению, поскольку myChild имеет значение null. myParent является допустимым объектом. Чего я не понимаю, так это того, почему myChild еще не создан.

Я прочитал следующий документ, связанный с последовательностью создания объекта, но я не уверен, как «новый» связан: http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_03.html

Любая помощь приветствуется!

// Main.mxml

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="created()">
    <mx:Script>
        <![CDATA[
            public var myParent:Parent = new Parent();
            public function created():void {
                myParent.foo();
            }
        ]]>
    </mx:Script>
</mx:Application>

// Parent.mxml

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*">
    <mx:Script>
        <![CDATA[
            public function foo():void {
                myChild.bar();
            }
        ]]>
    </mx:Script>
    <Child id="myChild"/>
</mx:Canvas>

// Child.mxml

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
             public function bar():void {
                trace("Hello World");
            }
        ]]>
    </mx:Script>    
</mx:Canvas>

Ответы [ 2 ]

1 голос
/ 26 мая 2010

creationComplete срабатывает, когда объект и все его дочерние элементы созданы и выведены на экран. Так как ваш родительский объект создан с

public var myParent:Parent = new Parent();

это не дочерний элемент вашего основного объекта, и событие creationComplete срабатывает до инициализации myParent.

Фактически, myParent.myChild будет оставаться нулевым, пока что-то не вызовет инициализацию myParent. Вы можете вызвать это, добавив его к компоненту на экране или просто позвонив по номеру myParent.initialize();

0 голосов
/ 26 мая 2010

Flex - это система визуального отображения / пользовательского интерфейса. Он предназначен для хранения списка элементов пользовательского интерфейса и обработки различных обновлений элементов в списке отображения.

Проблема в том, что вы никогда не добавляли родительский компонент в список отображения. Это делается с помощью метода AddChild в архитектуре Flex 2/3 Halo или AddElement, если вы используете архитектуру Flex 4 Spark.

После добавления компонента Parent на сцену с помощью метода AddChild этот компонент начнет проходить через компонент lifeCycle, который включает в себя создание его дочерних элементов (с помощью метода createChildren ()), а также определение размера и позиционирования дочерних элементов (с помощью updateDisplayList () ). При определении компонента и дочернего элемента с помощью MXML - например, ваш файл Parent.mxml определяет дочерний класс как дочерний с использованием XML - вызов метода addChild выполняется «автоматически» в фоновом режиме.

Имейте в виду, что жизненный цикл Flex Component - это процесс, который может быть не немедленным. Если вы выполняете addChild на родителя; Возможно, вы не сможете сразу получить доступ к детям этого родителя в следующей строке.

Итак, новые ключевые слова создают новый экземпляр компонента; но он не помещает этот компонент в displayList для обработки менеджерами компоновки Flex Framework.

Одним из способов исправления ситуации может быть изменение в основном файле приложения:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="created()">
    <mx:Script>
        <![CDATA[
            public function created():void {
                myParent.foo();
            }
        ]]>
    </mx:Script>
    <parent:Parent id="myParent" />
</mx:Application>

Другое может быть так:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="created()">
    <mx:Script>
        <![CDATA[
            public var myParent:Parent = new Parent();
            public function created():void {
                myParent.foo();
            }
            override protected function createChildren():void{
                super.createChildren();
                this.addChild(myParent);
            }

        ]]>
    </mx:Script>
</mx:Application>

Чтобы прочесть подробности об этом материале, прочитайте документы Flex Component LifeCycle. http://livedocs.adobe.com/flex/3/html/ascomponents_advanced_2.html#204762

...