Flex: всплывающее окно - получить [ok] или [отменить]

Я много программировал на C # как с Winforms, так и с WPF. Сейчас я работаю над приложением Flex / Air для кроссплатформенной поддержки. Но это мой первый гибкий проект, поэтому учусь по ходу дела.

У меня есть всплывающее окно, в котором пользователь заполняет форму, а затем нажимает ОК или ОТМЕНА. Я настроил его так же, как и в C #, но он не работает, и я не вижу способа заставить его делать то, что я хочу.

РЕДАКТИРОВАТЬ: Итак, я сейчас пробую события, события, похоже, просто не обрабатываются ...

ИЗМЕНИТЬ снова: О, это потому, что диспетчер всплывающих окон, кажется, создает новый экземпляр объекта Form, а не использует тот, который я уже создал.

поэтому в методе showWindow я вставил этот код, а не диспетчер всплывающих окон:

parent.addChild(this);

потом снимаю, когда закрываю. Единственная проблема в том, что он не отключает остальную часть родителя, как это делает диспетчер всплывающих окон. Есть предложения по этому поводу?

РОДИТЕЛЬ:

private function btnAdd_Clicked():void
{               
        var form:Form = new Form();
        form.addEventListener(CloseEvent.CLOSE, onFormClosed, false, 0, true);

        recipeForm.showWindow(this);
}

private function onFormClosed(e:CloseEvent):void
{
    //none of these Alerts are ever shown. I also tried breakpoints in debug to try an follow the code, with no luck
    Alert.show("Closed");
    if(e.detail == Alert.OK)
    {
        Alert.show("OK");
    }
    else if(e.detail == Alert.CANCEL)
    {
        Alert.show("Cancel");
    }
}

РЕБЕНОК:

private function btnCancel_Clicked():void
{
    okClicked = false;
    closeWindow();
}

public function closeWindow():void
{
    var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
    e.detail = okClicked ? Alert.OK : Alert.CANCEL;
    dispatchEvent(e);
    PopUpManager.removePopUp(this);
}

public function showWindow(parent:WindowedApplication):void
{
    var window:IFlexDisplayObject = PopUpManager.createPopUp(parent, RecipeForm, true);
    PopUpManager.centerPopUp(window);
}

person Joel    schedule 23.05.2009    source источник


Ответы (3)


Сделать это можно как минимум двумя способами:

ПЕРВЫЙ СПОСОБ: использование событий

Пусть ваш класс Form отправляет событие при нажатии любой из кнопок. После создания экземпляра формы из родительского представления добавьте eventListener для событий, которые, как известно, отправляются. Когда форма отправляет событие, вызывается eventListener. Вы даже можете повторно использовать событие CloseEvent Flex и установить для свойства «detail» значение Alert.OK или Alert.CANCEL перед его отправкой.

Сообщить:

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
e.detail = okClicked ? Alert.OK : Alert.CANCEL;
dispatchEvent(e);

В родительском:

var f:Form = new Form();
f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true);
...
private function onClose(e:CloseEvent):void
{
    if (e.detail == Alert.OK)
        // do something
    else if (e.detail == Alert.CANCEL)
        // do something else
}

ВТОРОЙ СПОСОБ: использование обратных вызовов

Добавьте общедоступную переменную типа "Function" в свой класс Form и предоставьте функцию обратного вызова от родителя. Это в основном то же самое, что и # 1, за исключением немного меньшей абстракции / косвенности.

Я бы порекомендовал №1, поскольку модель событий в Flex довольно хорошо продумана и более гибка, чем обратный вызов.

person cliff.meyers    schedule 23.05.2009
comment
Кажется, что это должно сработать, но событие просто не обрабатывается ... child: public function closeWindow (): void {var e: CloseEvent = new CloseEvent (CloseEvent.CLOSE); e.detail = okClicked? Alert.OK: Alert.CANCEL; dispatchEvent (е); PopUpManager.removePopUp (это); } родитель: частная функция btnAddRecipe_Clicked (): void {var recipeForm: RecipeForm = new RecipeForm (); recipeForm.addEventListener (CloseEvent.CLOSE, onRecipeFormClosed, false, 0, true); recipeForm.showWindow (это); } частная функция onRecipeFormClosed (e: CloseEvent): void {// никогда не попадает сюда ...: /} - person Joel; 23.05.2009
comment
о, комментарии не допускают разрывов строки ... oopps ... Я отредактирую это в своем исходном сообщении. - person Joel; 23.05.2009
comment
Что ж, похоже, что showWindow () возвращает новый экземпляр вашего класса RecipeForm. Вы хотите прикрепить прослушиватель событий к этому классу. Вы должны быть уверены, что объект, из которого вы отправляете событие, является тем же объектом, для которого зарегистрирован прослушиватель. - person cliff.meyers; 23.05.2009

Сообщить:

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
e.detail = okClicked ? Alert.OK : Alert.CANCEL;
dispatchEvent(e);

В родительском:

var f:Form = new Form();
f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true);
...
private function onClose(e:CloseEvent):void
{
    if (e.detail == Alert.OK)
        // do something
    else if (e.detail == Alert.CANCEL)
        // do something else
}
person Community    schedule 11.07.2009

Не уверен, что это все еще нерешенная проблема. Я столкнулся с той же проблемой, и я думаю, что понял, что не так. По крайней мере, я сделал это для своей проблемы.

Я реализовал вещи точно так же, как и вы. У меня также установлен атрибут close на closeWindow (я использую TitleWindow для своего диалога).

Поэтому, когда окно закрывается с помощью X вверху, оно вызывает closeWindow, также, если вы нажимаете кнопку «Отмена», оно также вызывает closeWindow. Проблема для меня заключалась в том, что нажатие кнопки «Отмена» отправляет событие CloseEvent, которое, кажется, улавливается Listener, который снова вызывает closeWindow (возможно, через атрибут close, который, вероятно, создает свой собственный внутренний прослушиватель). Я не уверен, что это бесконечный цикл, но Flex это не нравится.

Мое решение состояло в том, чтобы создать две функции: одну для вызова окна закрытия X и одну для кнопки «Отмена», чтобы отправить собственное событие CloseEvent. Похоже, это сработало для меня. Надеюсь, это поможет тебе.

person Ryan K    schedule 14.11.2009