Ter referências diretas para os containers pai nunca é uma boa idéia. Talvez neste caso nem seja um problema muito grande a princípio. De qualquer forma, você conseguiria uma solucão mais limpa usando o Bubles.
O seu teste mxml continua como antes: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:view="*" initialize="onInitialize()"> <mx:Script> <![CDATA[ import mx.controls.Alert; private function onInitialize():void { addEventListener(ItemSelectedEvent.ITEM_SELECTED, popula); } private function popula(event:ItemSelectedEvent):void { Alert.show("foi"); } ]]> </mx:Script> <mx:Label id="nome" text="nome"/> <view:comp id="meuComp"/> </mx:Application> Mas o comp.mxml e o ItemSelectedEvent.as sofreram algumas modificações. comp.mxml: <?xml version="1.0" encoding="utf-8"?> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" initialize="onInitialize()"> <mx:Script> <![CDATA[ import mx.events.ItemClickEvent; import mx.collections.ArrayCollection; [Bindable] private var items:ArrayCollection = new ArrayCollection(); private function onInitialize():void { var o1:Object = new Object(); o1.nome = "Obina"; items.addItem(o1); var o2:Object = new Object(); o2.nome = "Zico"; items.addItem(o2); } private function onChange():void { var newEvent:ItemSelectedEvent = new ItemSelectedEvent(ItemSelectedEvent.ITEM_SELECTED); newEvent.bubbles = true; dispatchEvent(newEvent); } ]]> </mx:Script> <mx:DataGrid dataProvider="{items}" change="onChange()"/> </mx:Panel> ItemSelectedEvent: package { import flash.events.Event; public class ItemSelectedEvent extends Event { public static const ITEM_SELECTED:String = "ItemSelected"; public function ItemSelectedEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } } } []'s Beck Novaes On Jul 3, 4:42 pm, Hamad Amaral <[EMAIL PROTECTED]> wrote: > Beck, > > Desculpe voltar ao assunto, mas e no caso de um container filho > disparando evento no container pai? A solução abaixo também é boa o > suficiente? > > Obrigado. > > teste.mxml: > > <?xml version="1.0" encoding="utf-8"?> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" > xmlns:view="*" initialize="onInitialize()"> > > <mx:Script> > <![CDATA[ > import mx.controls.Alert; > > private function onInitialize():void > { > > addEventListener(ItemSelectedEvent.ITEM_SELECTED, popula); > } > > private function popula(event:ItemSelectedEvent):void > { > Alert.show("foi"); > } > ]]> > </mx:Script> > > <mx:Label id="nome" text="nome"/> > > <view:comp id="meuComp"/> > > </mx:Application> > > comp.mxml: > > <?xml version="1.0" encoding="utf-8"?> > <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" > initialize="onInitialize()"> > > <mx:Script> > <![CDATA[ > import mx.collections.ArrayCollection; > > [Bindable] > private var items:ArrayCollection = new > ArrayCollection(); > > private function onInitialize():void > { > var o1:Object = new Object(); > o1.nome = "Obina"; > items.addItem(o1); > > var o2:Object = new Object(); > o2.nome = "Zico"; > items.addItem(o2); > } > > private function onChange():void > { > parent.dispatchEvent(new ItemSelectedEvent()); > } > ]]> > </mx:Script> > > <mx:DataGrid dataProvider="{items}" change="onChange()"/> > > </mx:Panel> > > ItemSelectedEvent: > package > { > import flash.events.Event; > > public class ItemSelectedEvent extends Event > { > public static const ITEM_SELECTED:String = "ItemSelected"; > > public function ItemSelectedEvent() > { > super(ItemSelectedEvent.ITEM_SELECTED); > } > > } > > } > > BN> Bem, olhando para este exemplo simplificado a sua solução parece boa o > BN> suficiente. Uma outra abordagem, tomando como premissa a maneira como > BN> o problema foi colocado, ou seja, "Executar uma ação num componente > BN> toda vez que o item selecionado no Grid mudar", poderia ser armazenar > BN> uma referência para o Grid no seu componente. Mas como o que você quer > BN> basicamente é tratar o evento "change", você pode tornar isto um pouco > BN> mais genérico para aceitar um Grid, um List, um Horizontal List, etc. > > BN> <?xml version="1.0" encoding="utf-8"?> > BN> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > BN> layout="vertical" > BN> xmlns:view="*" initialize="onInitialize()"> > > BN> <mx:Script> > BN> <![CDATA[ > BN> import mx.collections.ArrayCollection; > > BN> [Bindable] > BN> private var items:ArrayCollection = new > BN> ArrayCollection(); > > BN> private function onInitialize():void > BN> { > BN> var o1:Object = new Object(); > BN> o1.nome = "Obina"; > BN> items.addItem(o1); > > BN> var o2:Object = new Object(); > BN> o2.nome = "Zico"; > BN> items.addItem(o2); > BN> } > > BN> ]]> > BN> </mx:Script> > > BN> <mx:DataGrid id="myGrid" dataProvider="{items}"/> > > BN> <view:comp id="meuComp" listControl="{myGrid}"/> > > BN> </mx:Application> > > BN> Comopente comp.mxml: > > BN> <?xml version="1.0" encoding="utf-8"?> > BN> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"> > > BN> <mx:Script> > BN> <![CDATA[ > BN> import mx.events.ListEvent; > BN> import mx.controls.listClasses.ListBase; > > BN> private var _listControl:ListBase; > > BN> [Bindable] > > BN> public function set listControl(value:ListBase):void > BN> { > BN> _listControl = value; > BN> _listControl.addEventListene(ListEvent.CHANGE, > listChangeHandler); > BN> } > > BN> public function get listControl():ListBase > BN> { > BN> return _listControl; > BN> } > > BN> private function listChangeHandler(event:ListEvent):void > BN> { > BN> // do something > BN> } > > BN> ]]> > BN> </mx:Script> > > BN> <mx:Label id="nome" text="nome"/> > > BN> </mx:Panel> > > BN> Não sei se é a melhor solução pois isto depende dos seus requisitos. > BN> Mas é uma maneira diferente de fazer a mesma coisa. > > BN> []'s > BN> Beck Novaes > > BN> On Jul 1, 11:53 am, Hamad Amaral <[EMAIL PROTECTED]> wrote: > > > > >> Flexers, > > >> Tenho uma tela com um grid e um componente panel (na verdade a > >> aplicação é maior, mas simplifiquei para poder postar o código). > > >> Gostaria de ao selecionar um item no grid um evento seja disparado > >> para que uma ação no componente seja executada. > > >> Da maneira que o código está escrito funciona sem problemas mas gostaria > >> de saber se temos alguma solução melhor. > > >> Segue meu código: > > >> <?xml version="1.0" encoding="utf-8"?> > >> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" > >> xmlns:view="*" initialize="onInitialize()"> > > >> <mx:Script> > >> <![CDATA[ > >> import mx.collections.ArrayCollection; > > >> [Bindable] > >> private var items:ArrayCollection = new > >> ArrayCollection(); > > >> private function onInitialize():void > >> { > >> var o1:Object = new Object(); > >> o1.nome = "Obina"; > >> items.addItem(o1); > > >> var o2:Object = new Object(); > >> o2.nome = "Zico"; > >> items.addItem(o2); > >> } > > >> private function onChange():void > >> { > >> meuComp.dispatchEvent(new > >> ItemSelectedEvent()); > >> } > > >> ]]> > >> </mx:Script> > > >> <mx:DataGrid dataProvider="{items}" change="onChange()"/> > > >> <view:comp id="meuComp"/> > > >> </mx:Application> > > >> Comopente comp.mxml: > > >> <?xml version="1.0" encoding="utf-8"?> > >> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" > >> initialize="onInitialize()"> > > >> <mx:Script> > >> <![CDATA[ > >> import mx.controls.Alert; > > >> private function onInitialize():void > >> { > >> > >> addEventListener(ItemSelectedEvent.ITEM_SELECTED, popula); > >> } > > >> private function > >> popula(event:ItemSelectedEvent):void > >> { > >> Alert.show("foi"); > >> } > >> ]]> > >> </mx:Script> > > >> <mx:Label id="nome" text="nome"/> > >> </mx:Panel> > > >> Evento ItemSelectedEvent.as: > > >> package > >> { > >> import flash.events.Event; > > >> public class ItemSelectedEvent extends Event > >> { > >> public static const ITEM_SELECTED:String = "ItemSelected"; > > >> public function ItemSelectedEvent() > >> { > >> super(ItemSelectedEvent.ITEM_SELECTED); > >> } > > >> } > > >> } > > -- > Hamad Amaral > [EMAIL PROTECTED]/blog --~--~---------~--~----~------------~-------~--~----~ Você recebeu esta mensagem porque está inscrito na lista "flexdev" Para enviar uma mensagem, envie um e-mail para [email protected] Para sair da lista, envie um email em branco para [EMAIL PROTECTED] Mais opções estão disponíveis em http://groups.google.com/group/flexdev -~----------~----~----~----~------~----~------~--~---
