possível bug no flex 3.0? [RESOLVIDO]

3 respostas
G

Tenho uma tela com um tabnavigator e 5 abas.Na primeira aba, tenho um datagrid que é carregado com dados vindos do banco de dados ( passando por um array de Strings ).Montei um código de modo que quando o grid é carregado, ao clicar em qualquer uma das linhas do grid, o conteúdo desta linha carrega
caixas de textos e combobox espalhados nas outras abas do tabnavigator.O código de um dos combobox segue abaixo:

<mx:ComboBox x=“128” y=“112” width=“100” id=“nascF” text="{gridFisio.selectedItem.nascimentoFisi}">
mx:ArrayCollection

<mx:String>A termo</mx:String>
	<mx:String>Pró-termo</mx:String>
	<mx:String>Pós-termo</mx:String>

</mx:ArrayCollection>
</mx:ComboBox>

Tudo deveria funcionar normalmente, mas quando clico no datagrid, somente as caixas de texto são carregadas com informação.E os combos não.Porém, o mais estranho, é que depois que eu vou clicando e passando em cada aba do tabnavigator ( ele dá um tipo de refresh na tela pois a barra de status é recarregada ), e quando clico novamente no datagrid, o combo carrega, ou seja, funciona normalmente, somente se eu passar por todas as abas.Estranho não!?

Se eu troco o combobox por um inputtext a informação aparece normal, ou seja, a informação está chegando na tela normalmente.

Já tentei colocar algo como nomedocombo.selectedItem = gridFisio.selectedItem.nascimentoFisi, mas ocorre a mesma coisa…

Alguém já passou por algo parecido?

3 Respostas

renzonuccitelli

A classe TabNavigator, assim como sua parente ViewStack primitiva, não cria todas suas abas de uma vez. Por motivos de performance, ela só cria as abas que são necessárias, quando elas ficam visíveis. Por isso as coisas funcionam quando vc clica em todas as abas.

Mas vamos a resposta prática: existe um atributo do TabNavigator chamado creationPolicy, que por padrão é auto, ou seja, se comporta como já descrevi. Se vc setar ele como all, todas suas abas serão criadas e vc vai conseguir fazer o que deseja sem clicar em todas, pagando o preço de ter as telas construidas logo quando rodar o TabNavigator.

Tome cuidado também com o combo quando vc alterar seu dataProvider. Quando vc seta um novo dataProvider, ele não olha o selectedItem pra continuar com o item selecionado, acarretando em alguns problemas. Eu até criei um outro combo pra evitar esse problema.

Segue o código:
package br.com.nuccitelli.component {
	import flash.events.Event;
	import mx.binding.utils.BindingUtils;
	import mx.utils.ObjectUtil;
	import spark.components.DropDownList;

	public class DropDowListWithMemory extends DropDownList {
		private var _selectedItemInMemory:Object=null;

		public function DropDowListWithMemory() {
			super();
			BindingUtils.bindSetter(dataProviderHandler,this,[ "dataProvider","length" ]);
		}

		private function dataProviderHandler(obj:Object=null):void {
			if(_selectedItemInMemory) {
				for each(var item:Object in this.dataProvider) {
					if(this.equals(item,_selectedItemInMemory)) {
						this.selectedItem=item;
						break;
					}
				}
			}
		}

		/**
		 * The selectedItemInMemory sets selectedItem in 2 ocasions:
		 * 1) When you set selectedItemInMemory and data provider has an equals object
		 * 2) When dataProvider change and has an object equals to selectedItemInMemory
		 **/
		public function get selectedItemInMemory():Object {
			return _selectedItemInMemory;
		}

		/**
		 * The selectedItemInMemory sets selectedItem in 2 ocasions:
		 * 1) When you set selectedItemInMemory and data provider has an equals object
		 * 2) When dataProvider change and has an object equals to selectedItemInMemory
		 **/
		public function set selectedItemInMemory(value:Object):void {
			_selectedItemInMemory=value;
			dataProviderHandler();
		}

		private function equals(item:Object,item2:Object):Boolean {
			return ObjectUtil.compare(item,item2)==0;
		}
	}
}
código do teste unitário:
package br.com.nuccitelli.component {
	import flexunit.framework.Assert;
	import mx.collections.ArrayCollection;

	public class DropDowListWithMemoryTest {

		[Test]
		public function testSelectedItemWithExistingDataProvider():void {
			var combo:DropDowListWithMemory=new DropDowListWithMemory();
			combo.dataProvider=new ArrayCollection([ "A" , "B" , "C" ]);
			Assert.assertUndefined(combo.selectedItem);
			combo.selectedItemInMemory="B";
			Assert.assertEquals("B" , combo.selectedItem);
		}

		[Test]
		public function testSelectedItemWithOutExistingDataProvider():void {
			var combo:DropDowListWithMemory=new DropDowListWithMemory();
			combo.dataProvider=new ArrayCollection([ "A" , "B" , "C" ]);
			Assert.assertUndefined(combo.selectedItem);
			combo.selectedItemInMemory="D";
			Assert.assertUndefined(combo.selectedItem);
			combo.dataProvider=new ArrayCollection([ "A" , "B" , "C" , "D" ]);
			Assert.assertEquals("D" , combo.selectedItem);
		}
	}
}

O código já está usando o DropDownList do Flex 4, pra vc portar pro 3, basta trocar a classe por combo.

Enfim, qq dúvida é só perguntar, e se precisar de um curso, recomendo a Eng em SP e, puxando a sardinha, a Nuccitec em São José dos campos.

[]s

G

Resposta simplesmente sensacional…resolveu no ato.

Então, até pensei que fosse bug, pois vi que em vários fóruns em inglês o pessoal fala sobre a questão de “recriar” um componente ComboBox devido algumas falhas.

Então, eu tenho já um conhecimento razoável de flex.É que como aprendi sozinho, alguns detalhes passam batido as vezes “quebram” agente…rs…
Tenho amigos que fizeram curso na ENG e falam muito bem.Com certeza se me perguntarem eu indico…

Obrigado aí pelo tempo dispensado para elaboração da resposta.Se quiser enviar algum material de divulgação de cursos pode contar comigo.Com certeza posso divulgar pra uma galera aqui na minha região.( [email removido] )
Grande abraço.

renzonuccitelli

Eu tb aprendi sozinho, só depois fiz o curso na ENG. Achei o curso bem interessante, e acabei abrindo o meu…hehe. Qto a material, confira no site da Nuccitec. Eu estou acabando a documentação do JFERA, um framework que fiz pra facilitar a integração com Google App Engine. Eu fiz o www.revelacaovirtual.com.br utilizando ele.
Dá uma olhada também no www.blog.nuccitec.com.br. Tem um transformador de classas Java para Flex simplesinho lá, mas que quebra um galho no dia-a-dia.

[]s

Criado 16 de setembro de 2010
Ultima resposta 16 de set. de 2010
Respostas 3
Participantes 2