Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   creationComplete и вложенные компоненты (http://www.flasher.ru/forum/showthread.php?t=136049)

Lexa_ 08.02.2010 20:47

creationComplete и вложенные компоненты
 
Схема такая:
"application"-b-c
|
a
У приложения состояния а и b, в которые грузятся компоненты соответственно. У компонента b есть состояние с, в котором грузится соответсвующий компонент. Нужно передать данные из компонента "a" в компонент "с". Если последовательно менять состояния - компонент "c" не успевает грузиться. А как отловить на нем creationComplete чет не догоню.

Приложение
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*" currentState="a">
        <mx:states>
                <mx:State name="a">
                        <mx:AddChild position="lastChild">
                                <ns1:a x="0" y="0">
                                </ns1:a>
                        </mx:AddChild>
                </mx:State>
                <mx:State name="b">
                        <mx:AddChild position="lastChild">
                                <ns1:b x="0" y="0" id="compB">
                                </ns1:b>
                        </mx:AddChild>
                </mx:State>
        </mx:states>
</mx:Application>

Компонент a
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
        <mx:Script>
                <![CDATA[
                        public function setData():void {
                                parentApplication.currentState = "b";
                                parentApplication.compB.currentState = "c";
                                parentApplication.compB.compC.testText.text = inputText.text;
                        }
                ]]>
        </mx:Script>
        <mx:TextInput x="10" y="10" id="inputText"/>
        <mx:Button x="10" y="40" label="Set data" id="testButton" click="setData()"/>
 
</mx:Canvas>

Компонент b
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" xmlns:ns1="*">
        <mx:states>
                <mx:State name="c">
                        <mx:AddChild position="lastChild">
                                <ns1:c x="0" y="0" id="compC">
                                </ns1:c>
                        </mx:AddChild>
                </mx:State>
        </mx:states>
 
</mx:Canvas>

Компонент C
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
        <mx:Label id="testText" text="" horizontalCenter="0" verticalCenter="0" fontSize="36"/>
 
</mx:Canvas>


nocoments 08.02.2010 21:12

Код AS3:

 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" createComplite="create">
</mx:Application>


Lexa_ 09.02.2010 13:05

:) Как в самом компоненте - ежу понятно, а вот как это событие отловить в другом компоненте. Дело в том, что

Код AS3:

parentApplication.compB.compC.addEventListener(FlexEvent.CREATION_COMPLETE, eventFunction);

Не срабатывает, потому как компонент "с" еще не создался.

BeDLiNt 09.02.2010 13:09

Код AS3:

<mx:Application creationPolicy="all" .../>


Lexa_ 09.02.2010 14:10

creationPolicy="all" не работает, он просто не успевает создавать все компоненты и, опять же, напарываемся на нулевой объект.

В общем вот решение:
Код AS3:

 
public function setData():void {
        parentApplication.currentState = "b";
        parentApplication.compB.addEventListener(StateChangeEvent.CURRENT_STATE_CHANGE, stateChangeComplete); //вешаем слушателя изменений состояний на компонент b
        parentApplication.compB.currentState = "c";
}
 
private function stateChangeComplete(event:StateChangeEvent) {
        if (event.newState == "c") {
        //проверяем, имя нового состояния, если оно, значит компонент уже добавлен и доступны его свойства
        parentApplication.compB.compC.testText.text = inputText.text;
        }
}


BeDLiNt 09.02.2010 14:57

Цитата:

creationPolicy="all" не работает, он просто не успевает создавать все компоненты и, опять же, напарываемся на нулевой объект.
А у вашего компонента пробовали выставлять creationPolicy="all" ?

Lexa_ 09.02.2010 15:13

Да, ради эсперимента везде проставлял.


Часовой пояс GMT +4, время: 01:57.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.