|
|
|||||
Событие закрытия окна
С наступившим всех!
Вопрос каждый раз вводит в ступор на протяжении 1,5 лет (все эти 1,5 лет решался костылями различной степени кривости). Ну хоть раз то надо попытаться спросить, вдруг у кого есть элегантное решение. Условие (к реальности отношения не имеет, просто для объяснения): 1. Есть окно авторизации 2. По его закрытию возможны варианты: - закрыли по кнопке омена - закрыли крестиком - закрыли по кнопке ok ( в этом случае надо передать имя пользователя в колбек ) 3. Обязательно надо знать что окно закрыто впринципе, чтобы продолжить приостановленную анимацию например 4. И тут начинаются проблемы: window.addEventListener(WindowEvent.CLOSE, onWindowClose); window.addEventListener(CustomWindowEvent.OK_CLICK, onOkClick); Впринципе посылается и посылается, но нам надо при закрытии по крестику и закрытии по OK делать разные вещи. Т.е. при закрытии по OK нам не надо говорить "извините, введите имя". И начинается: если сработало OK_CLICK, отписываемся от события CLOSE или начинается лепка флагов. Как вообще организовать эти события закрытия окон по-человечески, чтобы не думать какой колбек раньше сработает? |
|
|||||
Наверное по кнопке OK не диспатчить событие закрытия окна? Что за window - самописный?
__________________
if (love is true) break my.heart; |
|
|||||
А зачем здесь вообще каст. события? Я не знаю как вам лучше, но я бы ловил клик мыши, затем смотрел бы по какому объекту клик был сделан: если по ок - проверяем поле ввода имени пользователя и пр., если другое - закрываем окно, делаем что то другое...
|
|
|||||
Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
|
- можно добавить в ваш оконный класс параметр, дистпатчить ли CLOSE при закрытии, т.е в первом случае при клике вызываем hide(), во втором hide(false)
- можно в окне ставить флаг, что имя введено и при close узнавать у окна, введено ли имя (т.е. обойтись одним событием) а вобще если все хотите обрабатывать в одном хендлере, как раз и будут получаться флаги и тому прочее, лучше слушать разные события, просто клик по крестику и кнопке "отменить" будут диспатчить одно событие, кнопка "ок" - другое
__________________
low + |
|
|||||
Это не просто окно, а диалоговое окно. Поэтому логично сделать
loginWindow=new DialogWindow(); loginWindow.addEventListener(DialogEvent.ANSWER,loginAnswerHandler); ... function loginAnswerHandler(event:DialogEvent){ switch(event.btnCode){ case DialogButtons.OK: login(); break; case DialogButtons.CANCEL: case DialogButtons.CLOSE: if(!canCloseLoginDialog()){ event.preventDefault(); showWarning("Thou shalt not close this window!"); } break; } }
__________________
aka doctorstal |
|
|||||
Цитата:
Цитата:
Цитата:
2 crazyone: во-во, такой подход в последнем проекте используем. Только с целочисленными, а не строковыми ключами выхода. Т.е. функция закрытия базового окна принимает ключ закрытия, 0 - это крестик или Cancel, а что значат 1,2 и т.д. определяется в окнах-наследниках (в статических константах на классе окна). Тут проблемы возникли с передачей чего-то большего, чем код возврата. Еще свичи смущают. Видимо самый адекватный вариант взять эту схему и расширить метод close(closeCode) до close(closeCode:int, data:Object = null); С типизацией тут все равно лучше ничего не придумаешь, а свитчи - они не кусаются и в обработке закрытия диалогов ещё _не_ вредили. Последний раз редактировалось expl; 05.01.2012 в 20:23. |
|
|||||
Относительно передачи данных - я добавлял в DialogEvent атрибут data и все нужное (состояние диалога) не гнушаясь пихал туда.
Можно еще в DialogWindow добавить метод getData. Или сохранять данные диалога в модели и потом при надобности - из нее доставать... Вопрос передачи данных - вопрос глобальный, мне кажется. Его нужно рассматривать в контексте всей архитектуры проекта =)
__________________
aka doctorstal |
|
|||||
кнопка "X" (закрыть), грубо говоря, вообще ничего не должна диспатчить.
у любого диалогового окна должна быть дефолтная кнопка. соответственно, клик по крестику нажимает дефолтную кнопку и все. остается, только Ok и Cancel - вот по ним и нужно диспатчить два разных события. p.s. все субьективно. так бы делал я. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
crazyone, проще if (super.dispatchEvent(...)) this.close();
|
|
|||||
Цитата:
Цитата:
Я запарился именно с закрытием диалога. |
Часовой пояс GMT +4, время: 15:05. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|