PDA

Просмотр полной версии : creationComplete и вложенные компоненты


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

Приложение
<?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
<?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
<?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
<?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
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" createComplite="create">
</mx:Application>

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

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

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

BeDLiNt
09.02.2010, 13:09
<mx:Application creationPolicy="all" .../>

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

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

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
Да, ради эсперимента везде проставлял.