Hola
avielo !
Te voy a dejar un ejemplo de como se podría implementar.
Primero vamos a crear 2 componentes.
Componente1.mxml
Código actionscript:
Ver original<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="300" height="300">
<mx:Script>
<![CDATA[
private function onClick():void {
dispatchEvent(new Event(Event.CHANGE, true));
}
]]>
</mx:Script>
<mx:Button x="117" y="116" label="Button" click="onClick()"/>
</mx:Canvas>
Es el que va a lanzar el evento para que posteriormente el Componente2 lo capture, fíjate que el segundo parámetro al crear una instancia Event es un valor booleano, este indica si queremos propagar el evento, esto quiere decir que el evento se va pasando de hijo a padre hasta llegar a la raiz del proyecto.
Ahora nuestro segundo componente:
Componente2.mxml
Código actionscript:
Ver original<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="300" height="300">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
public function showMessage():void {
Alert.show("Ha cambiado el componente 1.");
}
]]>
</mx:Script>
</mx:Canvas>
Aquí simplemente es un método público que lo llamaremos cuando capturemos el evento enviado por componente1.
Aquí la magia está en tener una clase controladora que se encargue de capturar los eventos de la aplicación, los centralizamos, esa es la razón por la que coloque true al lanzar el evento, con la finalidad de que se propagara y de esa manera poder capturarlo en la raiz del proyecto:
Controller.as
Código actionscript:
Ver originalpackage
{
import flash.events.Event;
import mx.core.Application;
public class Controller
{
//Referencia a la raiz de nuestro proyecto.
private var _app:Ejemplo = Application.application as Ejemplo;
public function Controller() {
}
public function init():void {
_app.addEventListener(Event.CHANGE, onChange);
}
private function onChange(evt:Event):void {
_app.showMessage();
}
}
}
Si te das cuenta a la instancia _app le digo que escuche por algún cambio, al notificarle llama al método showMessage que se encuentra en la raiz:
Ejemplo.mxml (raiz del proyecto)
Código actionscript:
Ver original<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" initialize="init()">
<mx:Script>
<![CDATA[
private function init():void {
var controller:Controller = new Controller();
controller.init();
}
public function showMessage():void {
comp2.showMessage();
}
]]>
</mx:Script>
<local:Componente1 id="comp1" />
<local:Componente2 id="comp2" />
</mx:Application>
En la raiz inicializamos nuestro controlador, también se encuentra el método showMessage que llama al método showMessage del Componente2.
Espero que te sea de ayuda.
Un saludote !