Flex - comunicação entre dois componentes num ViewStack [RESOLVIDO]

11 respostas
pgnt

Olás

Tenho um ViewStack e carrego um componente cada NavigatorContent.

Há um componente de listar cliente (aparece primeiro) e outro de inserir cliente.

Preciso que a lista do primeiro componente seja atualizada assim que eu inserir um cliente (quando por ex, eu inserir e voltar pra outra view pra ver a lista, constar o cliente lá).

Já tentei apontar direto da segunda view para o datagrid da primeira (forma não recomendada) e também despachar evento de cliente inserido pra pegar na view da lista mas não funcionou, parece que ele perde a referência dos objetos entre as views.

Alguém tem alguma sugestão?
Obrigado!

11 Respostas

V

criar um metodo que atualiza a viewstack,
quando inserir os dados.
ou caso vc esteja usando remote object
no result vc faz o refresh

não sei se entendi bem sua duvida…

mas pelo que entendi
essa é uma sugestão.

pgnt

O problema é que não consigo acessar o objeto de outra view pra isso ou, quando despacho um evento de uma view, a outra não consegue pegar também (acho que as views perdem suas instâncias quando mudamos de uma pra outra).

Uma forma que encontrei pra meu problema foi recarregar o DataGrid da primeira view no evento “show” do NavigatorContent, mas não consegui fazer a comunicação dos componentes entre as views.

Valeu!

F

Usa o container das duas views como um Mediator. :smiley:

pgnt

O container dos componentes é o ViewStack.
Imagino que esteja falando de tentar algo como “views.cpBuscaCliente.dataGridCliente…” (de acordo com o cod abaixo) , mas o flex não cria árvore de objetos, os IDs (objetos) são acessados diretos, mas mesmo assim, tentando acessar direto o “cpBuscaCliente” no componente de inserir cliente não deu certo, ele não reconhece o obj/componente de busca.

Obrigado!

<mx:ViewStack id="views" width="100%" height="100%">
			
			<s:NavigatorContent id="vsBuscar" label="Buscar" show="buscarCliente.init()"   >	
					<cp:BuscarCliente 	id="cpBuscarCliente"  	/>		
			</s:NavigatorContent>
			
			<s:NavigatorContent id="vsInserir" label="Inserir" >	
				<cp:InserirCliente id="cpInserirCliente"  />		
			</s:NavigatorContent>
			
		
		</mx:ViewStack>
F

Nao nao oque voce esta tentando fazer é tight coupling um componente dependente do outro. Mudou um id, fo**u a aplicacao.
Digo para disparar um custom event de um stack para ser capturado no container e o container executar a operacao no outro ou transferir informacoes para o outro stack.
Se nao entendeu, me adiciona no skype e eu te explico melhor. skype:fa.batista

pgnt

Pela hora complicou usar skype, mas tentei algo bem básico pra ver se a aplicação pega um custom event (bem simples), por enquanto não rolou mas ainda não vi onde errei.

1 - coloquei o listener onde ficam os componentes
<fx:Script>
		<![CDATA[
			
					
			import mx.controls.Alert;
			
			private function init():void{
				addEventListener("ClienteInserido",handleClienteInserido);
			}
			
			private function handleClienteInserido(e:Event):void{
				Alert.show("pegou ClienteInserido");
			}
			
		]]>
	</fx:Script>


....


<mx:ViewStack id="views" width="100%" height="100%">  
      
    <s:NavigatorContent id="vsBuscar" label="Buscar"  >    
            <cp:BuscarCliente    id="cpBuscarCliente"    />         
    </s:NavigatorContent>  
      
    <s:NavigatorContent id="vsInserir" label="Inserir" >    
        <cp:InserirCliente id="cpInserirCliente"  />        
    </s:NavigatorContent>  
      
  
</mx:ViewStack>
2 - no componente de inserir cliente o disparo o evento no método que trata o sucesso de cadastro
dispatchEvent(new Event("ClienteInserido"));

Qq coisa nos falamos amanhã, mas acho que estou quente segundo sua idéia.
Valeu!

F

Isso ae. Essa é a idéia do Design Pattern Mediator.

pgnt

Legal! Para funcionar só faltou adicionar o parâmetro “true” para despachar o evento como bubble (achei que era default o bubble)

Brigadão pela força :smiley:
abs

F

nesse caso é necessario bubble? acredito que não pois o evento vem do root da aplicacao até o parent, ja tentou fazer sem o bubble?

pgnt

Sim, era como estava antes e, sem o bubble, não tava rolando.
Mas isso deve ser pq estou usando um módulo. Carrego na aplicação principal um módulo de cliente que por sua vez carrega os componentes (um de busca/edição/exclusão e outro de inserção).
abs

F

Entendi.

Criado 8 de fevereiro de 2011
Ultima resposta 11 de fev. de 2011
Respostas 11
Participantes 3