обработчик события
Здравствуйте. Есть следующий псевдо-код:
var Dlg = function () { this.onClose = function () {}; this.show = function () {}; this.doClose = function () { this.onClose(1); } } var test = function() { var dlg = new Dlg(); dlg.show(); dlg.onClose = function (e) { if (e != 0) { return "error"; // строка предназначена для test } } dlg.doClose(); } var result = test(); Здесь Dlg функция-конструктор, которая отвечает за отрисовку диалогового окна. onClose - обработчик события закрытия диалового окна, show - показывать окно, doClose - эмулирует событие закрытия окна. test - "главная" функция. Нужно, чтобы при закрытии окна в функцию-обработчик передавалось значение ошибки. Если e == 0, то всё ок, если e != 0, то нужно чтобы функция test завершилась return "error". Строка Код:
return "error"; Собственно вопрос. Как архитектурно правильно будет отловить событие onClose, чтобы потом манипулировать логикой в test? Спасибо за советы. |
Цитата:
Цитата:
|
Плохо изложил суть проблемы. Ещё раз. Нужна функция такого плана:
var test = function () { var dlg = new Dlg(); var result = dlg.show(); if (result == 0) { return "ok"; } else { return null; } } В С#, например, на строчке 3 выполнение функции test задержалось бы (опять же, это псевдо-код), а когда пользователь закрыл диалоговое окно, то результат вернулся бы переменной result и функция test продолжила бы выполнение. Но понимаю, что в данной функции return бутет раньше, чем пользователь закроет диалоговое окно. Вообщем буду что-то думать. |
о, теперь ясно
если хотите неасинхронно, то получите тормоза интерфейса (заморозку на время скрытия), зато код будет исполняться, как у вас в последнем варианте. если хотите плавности (скрывается за секунду и в это время можно потыкать и пошевелить мышей), то пишите код асинхронным // ваш пример var Dlg = function () { this.onClose = function () {}; this.show = function () {}; this.doClose = function () { this.onClose(1) } }; var dlg = new Dlg(); dlg.show(); var test; // тут будет строка dlg.onClose = function (e) { if (e != 0) { test = "error"; // строка предназначена для test /* ... тут дальше манипулируем с test ... */ } } dlg.doClose(); а это синхронный пример var Dlg = function () { this.onClose = function () {}; this.show = function () {}; this.doClose = function () { while( this.visible ) { /* скрываем */ if( /*почти скрыт*/ ) break; } this.onClose(1); } } var test = function() { var dlg = new Dlg(); dlg.show(); var str; dlg.onClose = function (e) { if (e != 0) { str = "error"; // строка предназначена для test } } dlg.doClose(); // т.к. у нас синхронность выполнения, можно написать так return str; } var result = test(); синхронность выполняет бесконечный цикл внутри doClose, который потом прервётся. на практике асинхронный способ даст плавность и интерактивность, а синхронный замирание на время скрытия |
сделать переопределение функции (overridden)
var originalOnClose = Dlg.onClose; Dlg.onClose = function() { alert("закрываеться окно"); return originalOnClose.call( this ); } |
Спасибо. Буду пробовать.
|
а лучше так:
var originalOnClose = Dlg.onClose; Dlg.onClose = function() { alert("закрываеться окно"); return originalOnClose.apply( this, arguments ); }Ктож знает, может там какие аргументы будут приходить |
Часовой пояс GMT +3, время: 08:43. |