Гибкий:Почему я не могу справиться с определенными событиями?
-
02-07-2019 - |
Вопрос
В некоторых случаях, похоже, я не могу заставить компоненты получать события.
[править]
Чтобы пояснить, пример кода приведен только для демонстрации, на самом деле я спрашивал, есть ли центральное местоположение, в которое можно было бы добавить прослушиватель, к которому можно было бы надежно отправлять события к произвольным объектам и от них.
В итоге я использовал parentApplication для отправки и получения события, которое мне нужно было обработать.
[/править]
Если два компонента имеют разные родительские элементы, или, как в примере ниже, один из них является всплывающим, может показаться, что событие никогда не достигает слушателя (см. Метод "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>
Я могу придумать обходные пути, но, похоже, должна быть какая-то центральная шина событий...
Я что-то упускаю?
Решение
Вышесказанное верно.Вы отправляете событие из btnMenu, но вы не прослушиваете события в btnMenu - вы прослушиваете события в Приложении.
Либо отправка из Приложения:
dispatchEvent(new Event("stepchild", true));
или послушайте в btnMenu
btnMenu.addEventListener("stepchild",handleStepChild);
btnMenu.dispatchEvent(new Event("stepchild",true));
Другие советы
Вы подключаете слушателя к this
когда событие отправляется из btnMenu
.
Это должно сработать:
dispatchEvent(new Event("stepchild", true));
ps.На самом деле нет никаких причин ставить ненужный 'this
" везде, если только это явно не требуется для преодоления проблем с областью применения.В этом случае вы можете просто оставить каждый this
вон.