PDA

Просмотр полной версии : Как увидеть Canvas в mxml конпоненте?


andruha_derby
26.08.2009, 19:20
Доброго времени суток.

Есть Application, у которой есть много комнонентов. В одном из компонентов есть Canvas, который периодичеки нужно делать невидимым.
Проблема в чем. Когда я обращаюсь к родителю ( в примере это RightArea) - флекс говорит: "все ок. Такой объект есть." Но когда я обращаюсь к Canvas внутри RightArea - " Обект topBox null". topBox - Это любой внутренний UI элемент, в данноми примере Canvas. Выставил creationPolicy="all" и событие creationComplete. НЕ помогает объекта нет.


<comp:RightArea
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comp="comp.*"

creationComplete="init2()"
creationPolicy="all">

<mx:Script>
[Bindable] public var _dataProvider2:Array = new Array();

public function init2():void{
var rA:RightArea= new RightArea();

rA.topBox.visible= true;
}
</mx:Script>
<mx:Canvas visible ="false">
<mx:Label text="Inside Label" />
</mx:Canvas>
<comp:RightArea>


Подскажите, пожалуйста, как победить проблему.

з.ы. Заранее спасибо.

wvxvw
26.08.2009, 20:11
Вы же рекурсивно создаете один и тот же компонент внутри самого себя... а чтобы получит ссылку на Canvas - самое простое - присвойте ему id какой-нибудть, это и будет имя свойства, инициализатором которого он будет являться.

andruha_derby
26.08.2009, 20:56
Внутри себя как раз понятно. Вы совершенно правы.


<comp:RightArea
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:comp="comp.*"

creationComplete="init2()"
creationPolicy="all">

<mx:Script>
public function init2():void{
canvas.visible= true;
}
</mx:Script>
<mx:Canvas id="canvas" visible ="false">
<mx:Label text="Inside Label" />
</mx:Canvas>
<comp:RightArea>

Работает. И очень хорошо.

Но интересует именно обращение из вне. Из другого класса.

з.ы. Прошу прощения, видимо не так сформулировал изначальный вопрос

wvxvw
26.08.2009, 21:33
var foo:RightArea = new RightArea();
foo.canvas; // <--- ссылка на ваш канвас.

andruha_derby
27.08.2009, 13:03
Загадочно как то выходит.
Если обращаюсь к компоненту так( предварительно расставив id). То есть обращение происходит из другого класса

Application.application.index.rightArea.canvas.visible = true;

Все работает.

Но если писать так

var _rightArea:RightArea = new RightArea();
_rightArea.canvas.visible = true; // Error #1009 canvas = null

Почему-то не работает. Странно.


wvxvw спасибо, вам за помощь.

wvxvw
27.08.2009, 13:30
Application.application.<что угодно>
<--- так делать никогда не нужно, это еще хуже чем в AS2 в рут что-то писать.

>> Почему-то не работает. Странно.
Потому что нужно дождаться, когда компонент создаст всех своих детей, обычно при этом он диспатчит событие http://livedocs.adobe.com/flex/3/langref/mx/core/Container.html#event:childAdd И в обработчике события нужно проверить, какой именно из детей добавился, если ваш - то можно к нему обращаться, если нет - подождите.
Если creationPolicy предписывает создать всех детей сразу, то, в принципе, ребенок уже должен будет существовать после:
http://livedocs.adobe.com/flex/3/langref/mx/core/UIComponent.html#event:initialize события.

andruha_derby
27.08.2009, 19:14
wvxvw спасибо за ответ.

з.ы. Тему можно закрывать.