Flex: Perché non riesco a gestire determinati eventi?
-
02-07-2019 - |
Domanda
In alcuni casi, non riesco a ottenere componenti per ricevere eventi.
[modifica]
Per chiarire, il codice di esempio è solo a scopo dimostrativo, quello che stavo davvero chiedendo era se ci fosse una posizione centrale in cui un ascoltatore potesse essere aggiunto, a cui si possono inviare in modo affidabile eventi da e verso oggetti arbitrari.
Ho finito per usare parentApplication per inviare e ricevere l'evento che dovevo gestire.
[/ modifica]
Se due componenti hanno genitori diversi, o come nell'esempio seguente, uno è un popup, sembrerebbe che l'evento non raggiunga mai l'ascoltatore (per il dispatch che non funziona, vedi il metodo "popUp"):
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="init()">
<mx:Script>
<![CDATA[
import mx.controls.Menu;
import mx.managers.PopUpManager;
// Add listeners
public function init():void
{
this.addEventListener("child", handleChild);
this.addEventListener("stepchild", handleStepchild);
}
// Handle the no pop button event
public function noPop(event:Event):void
{
dispatchEvent(new Event("child"));
}
// Handle the pop up
public function popUp(event:Event):void
{
var menu:Menu = new Menu();
var btnMenu:Button = new Button();
btnMenu.label = "stepchild";
menu.addChild(btnMenu);
PopUpManager.addPopUp(menu, this);
// neither of these work...
this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]);
btnMenu.dispatchEvent(new Event("stepchild", true));
}
// Event handlers
public function handleChild(event:Event):void
{
trace("I handled child");
}
public function handleStepchild(event:Event):void {
trace("I handled stepchild");
}
]]>
</mx:Script>
<mx:VBox>
<mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/>
<mx:Button label="PopUp" id="btnPop" click="popUp(event)"/>
</mx:VBox>
</mx:Application>
Posso pensare a soluzioni alternative, ma sembra che ci dovrebbe essere un autobus per eventi centrale ...
Mi manca qualcosa?
Soluzione
Sopra è corretto. Stai inviando l'evento da btnMenu, ma non stai ascoltando eventi su btnMenu - stai ascoltando eventi sull'applicazione.
Spedizione dall'applicazione:
dispatchEvent(new Event("stepchild", true));
o ascolta sul btnMenu
btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
Altri suggerimenti
Stai collegando l'ascoltatore a this
quando l'evento viene inviato da btnMenu
.
Questo dovrebbe funzionare:
dispatchEvent(new Event("stepchild", true));
ps. Non c'è davvero motivo di inserire ovunque un " this
" inutile, a meno che non sia esplicitamente richiesto per superare i problemi relativi all'ambito. In questo caso puoi semplicemente lasciare fuori ogni this
.