Olá, no atual projeto em que estou trabalhando há necessidade de construir componentes em flex em tempo de execução, mas como fazer isso? para muitos isso é um mito para outros já imaginaram um loop em Action script que faça isso, como o exemplo abaixo:
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
-
creationComplete="{init()}">
-
-
<mx:Script>
-
<![CDATA[
-
import mx.controls.Label;
-
import mx.collections.ArrayCollection;
-
-
[Bindable]
-
private var array:ArrayCollection = new ArrayCollection(
-
[{nome:"teste"},{nome:"de"},{nome:"janderson"},{nome:"saberprogramar.com"},{nome:"gostou?"}]);
-
-
private function init():void{
-
-
for (var i:int=0; i <array.length;i++){
-
var label:Label = new Label();
-
label.text = array.getItemAt(i).nome;
-
box.addChild(label);
-
}
-
-
}
-
-
]]>
-
</mx:Script>
-
-
<mx:VBox id="box">
-
</mx:VBox>
-
-
</mx:Application>
parabéns para aqueles que imaginaram o código acima, vai funcionar e vai ser criado os labels um abaixo do outro pois se encontra em um vBox
Mas se eu disser que não é necessário, que existe uma forma mais simples que vc não vai precisar desta function que faz esse Loop? sim é verdade, poucos sabem mas o flex tem um recurso muito legal que simplifica ao máximo a vida do programador na hora de criar componentes em tempo de execução, estou falando do REPEATER.
esse exemplo que acabei de mostrar acima com repeater ficaria assim:
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
-
-
<mx:Script>
-
<![CDATA[
-
import mx.controls.Label;
-
import mx.collections.ArrayCollection;
-
-
[Bindable]
-
private var array:ArrayCollection = new ArrayCollection(
-
[{nome:"teste"},{nome:"de"},{nome:"janderson"},{nome:"saberprogramar.com"},{nome:"gostou?"}]);
-
-
-
]]>
-
</mx:Script>
-
-
<mx:VBox id="box">
-
<mx:Repeater id="myRepeater" dataProvider="{array}">
-
<mx:Label text="{myRepeater.currentItem.nome}"/>
-
</mx:Repeater>
-
</mx:VBox>
-
-
</mx:Application>
Bem mais simples não? é claro que não serve só para o caso citado acima, dê uma olhada na documentação aqui.
Bem é isso, post simples para mostrar algo simples que pode simplificar muita coisa
Cumps.
Popularity: 8% [?]

E se eu quiser usar o repeater fazendo ele via código, exemplo:
import mx.core.Repeater;
public var rep:Repeater;
public function Repetir():void {
rep = new Repeater;
}
Ae como falar pra ele quem ele deve repetir? Criei um Vbox via código, e um Canvas, da mesma maneira que o repeater acima e como dizer a ele que o canvas que está dentro do vbox(addChild) é quem eu quero que ele repita?
Rodrigo, vc fez uma pergunta interessante, não tinha imaginado essa necessidade, até mesmo que via código eu já ia preferir fazer um for
mas tem como sim... achei esse exemplo em um dos bons blogs que acompanho sobre flex... espero que ajude
http://blog.flexexamples.com/2008/05/28/displaying-radiobutton-controls-using-the-repeater-in-flex-redux/
neste exemplo no componente customizado dele no final ele mostra como usar repeater nestes casos.
Cumps.
Tome cuidado com o Repeater. O ideal é usar o List, que reutiliza os elementos de "row" e consome bem menos memória. Eu já tive problemas de Memory Leak com repeater e que foram sanados com o List. O Repeater não deve ser usado com um grande número de elementos.
Se vc quiser usar elementos visuais mais complexos do que um Label, você pode criar um componente e usá-lo como itemRenderer. Além disso, usando essa estratégia, você pode implementar "IF"s por meio de states dentro do ItemRenderer, o que também torna o código bem legível.
boa dica @Ricardo, não usei em uma possibilidade de dar memory leak, pequena escala, mais é bom saber disso, com o list tive alguns problemas com itemRederer, de manter o status do meu componente (nos caso os dados) mas confesso que depois que descobrir que sobrescerver o set data pode resolver não testei
Mais uma vez obrigado pela Dica
Cumps.
Eu tenho um amigo que tem um projeto bem interessante em Flex, Ele desenhou sua própria IDE utilizando Delphi, onde ele arrasta os componentes Formulario, Campos, Etc. Esses Campos, Formularios, Datasets, etc, são gravados no banco de dados onde o mesmo possui um dicionário de dados e depois são parseados utilizando ActionScript. È muito impressionante o que esse cara fez, todo o sistema é construindo em tempo de execução. Ele constrói sistemas gigantescos e todo o sistema fica com o mesmo tamanhando 1,3 MB, eu fique impressionando! Isso tudo utilizando Java, BlazeDS, Tomcat, Delphi, Adobe Flex 3 e Oracle.
[]s