Cairngorm XXXCommand быть выполнен несколько раз - PullRequest
1 голос
/ 08 октября 2009

Я столкнулся с проблемой. Я делаю ГИС-программу, используя flex.

В моем Приложении есть карта, когда я щелкаю один значок на карте, появляется окно A, когда я щелкаю ссылку внутри окна A, появляется окно B, но здесь возникает проблема, когда я закрываю окно B и нажимаю ссылку Внутри окна В другой раз всплывают два окна ...

В моем окне А у меня есть

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

Может ли кто-нибудь дать мне руку?

Большое спасибо!

Лучший, Шо

Ответы [ 3 ]

1 голос
/ 08 октября 2009

WindowBControl наследуется от FrontController? Если это так, вы, вероятно, создаете его несколько раз случайно. Это:

<control:WindowBControl id='control1'>

собирается создать экземпляр этого фронт-контроллера. Поскольку вы поместили эту строку кода в WindowA, вы будете создавать новый экземпляр этого контроллера каждый раз, когда создаете новый экземпляр WindowA. Это приведет к тому, что команды будут вызываться один раз для каждого экземпляра контроллера каждый раз, когда происходит событие.

Вы должны создавать экземпляры только для фронт-контроллеров, если вы уверены, что они будут создаваться только один раз. Основное приложение mxml - хорошее место для этого.

1 голос
/ 08 октября 2009

Первый

// Shouldn't this be in a FrontController class?
addCommand(WindowBControl.EVENT_POPUPWindowB,WindowBCommand);

Я думаю, что вы должны как-то вызвать PopupManager.removePopup, потому что ссылка на ActionScript Flex 3 гласит:

Открывается окно верхнего уровня. Рекомендуется вызывать метод removePopUp () для удаления всплывающих окон, созданных с помощью метода addPopUp (). Если класс реализует IFocusManagerContainer, у окна будет свой собственный FocusManager, так что если пользователь использует клавишу TAB для перемещения между элементами управления, будут доступны только элементы управления в окне

0 голосов
/ 10 октября 2009

Я найду другое решение.

В методе закрытия окна A я пишу

private function onClose():void
{
     PopUpManager.removePopUp(this);
     if(CairngormEventDispatcher.getInstance().hasEventListener(WindowBControl.EVENT_POPUPWindowB))
     {
         control1.removeCommand(WindowBControl.EVENT_POPUPWindowB);
     }

}
...