Команда Cairngorm XXX должна быть выполнена несколько раз
-
20-09-2019 - |
Вопрос
Я столкнулся с проблемой.Я создаю ГИС-программу с использованием flex.
В моем приложении есть карта, когда я нажимаю на один значок на карте, появляется WindowA, когда я нажимаю на ссылку внутри WindowA, появляется windowB, но здесь возникает моя проблема, когда я закрываю windowB и нажимаю на ссылку внутри WindowA в другой раз, появляются два windowB...
В моем WindowA у меня есть
...
var windowBEvt:WindowBEvent = new WindowBEvent();
CairngormEventDispatcher.getInstance().dispatchEvent(windowBEvt);
...
<control:WindowBControl id='control1'>
В WindowBControl у меня есть
addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);
В WindowBCommand у меня есть
public function execute(event:CairngormEvent):void
{
...
var windowB:WindowB = new WindowB();
PopUpManager.addPopUp(windowB);
...
}
Кто-нибудь может мне помочь?
Большое спасибо!
Лучший, Шуо
Решение
Наследует ли WindowBControl от FrontController?Если это так, то вы, вероятно, создаете его несколько раз случайно.Это:
<control:WindowBControl id='control1'>
собирается создать экземпляр этого фронт-контроллера.Поскольку вы поместили эту строку кода в WindowA, вы собираетесь создавать новый экземпляр этого контроллера каждый раз, когда вы создаете новый экземпляр WindowA.Затем это приведет к тому, что команды будут вызываться один раз для каждого экземпляра контроллера каждый раз, когда срабатывает ваше событие.
Вы должны создавать экземпляры фронтальных контроллеров только в том случае, если вы уверены, что они будут созданы только один раз.Основное приложение mxml - хорошее место для этого.
Другие советы
Первый
// Shouldn't this be in a FrontController class?
addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);
Я думаю, вам нужно каким-то образом вызвать PopUpManager.removePopup, потому что ссылка на Flex 3 ActionScript гласит:
Откроется окно верхнего уровня.Рекомендуется вызывать removePopUp() для удаления всплывающих окон, созданных с помощью метода addPopUp().Если класс реализует IFocusManagerContainer, окно будет иметь свой собственный FocusManager, так что, если пользователь использует клавишу TAB для перехода между элементами управления, будут доступны только элементы управления в окне
Я нахожу другое решение.
В методе закрытия Windowowa я пишу
private function onClose():void
{
PopUpManager.removePopUp(this);
if(CairngormEventDispatcher.getInstance().hasEventListener(WindowBControl.EVENT_POPUPWindowB))
{
control1.removeCommand(WindowBControl.EVENT_POPUPWindowB);
}
}