Команда Cairngorm XXX должна быть выполнена несколько раз

StackOverflow https://stackoverflow.com/questions/1535298

  •  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);
     }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top