Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Подписаться на событие визуального компонента, находящегося в другой ветке. (http://www.flasher.ru/forum/showthread.php?t=137637)

wvxvw 20.03.2010 23:21

Это... как бы вам сказать - фишка в том, что вы не можете отменить capture фазу, и ни про какие подписывания на события внутри класса речь не идет. Банальная ситуация - положили кнопку "Закрыть" на форму. Подписались на событие и смело думаем, что кнопка "Закрыть" всегда нашу форму и закроет. А тут откуда ни возьмись - вундеркинд типа MATE / Swiz - взял ваше событие от кнопки и тупо остановил до того, как оно пришло получателю, который форму должен был закрыть. Вы сидите, клацаете по кнопке - а она ничего не делает - комфортно? А предотвратить / предвидеть? - А не сможете, т.как вундеркинд подписавшийся после вас получит событие первым. И вообще, читайте про вред глобального доступа / глобальных переменных и всего такого - это одного поля ягода.

Rzer 16.04.2010 02:51

Родитель должен позаботиться о Ваших детях! Он должен сообщить непослушному ребёнку ссылку на кнут, чтобы тот прислушался к нему и больше не шалил)

Что то-типа метода attachDispatcher(dispatcher:IEventDispatcher):void;

dimarik 19.04.2010 23:52

Цитата:

Сообщение от wvxvw (Сообщение 894439)
Банальная ситуация - положили кнопку "Закрыть" на форму. Подписались на событие и смело думаем, что кнопка "Закрыть" всегда нашу форму и закроет.

Ну как бы всегда и закроет. А в чем подвох?

Не тестил стоп пропагейшн на капчур фазе ) Опять нет повода не выпить.

wvxvw 20.04.2010 03:56

Там достаточно просто чтобы в хендлере была какая-нибудь ошибка пойманая в другом месте, и планы по захвату мира накроются медным тазом.

Psycho Tiger 20.04.2010 17:30

А я не понимаю вообще событийную модель. Произошел клик по кнопке - событие со stage понеслось вниз, до виновника торжества - это capture фаза. Если её поймать - то беда, можно виновнику не узнать, что он виновник. Ну хорошо, бабблинг фаза всплывает и вызывает обработчики и у всех тех, кого пометила capture фаза. А вторая фаза на кой?

wvxvw 20.04.2010 18:33

Ну можно это представить так:
стейдж - единственный, кто регистрирует на события, т.е. все клики происходят на стейдже.
далее, стейдж идет по видимому дереву объектов и проверяет, а является ли объект интерактивным, а находится ли он в зоне клика.
вот это и будет фаза "захвата" события.
Когда у объекта не остается интерактивных детей удовлетворяющих условию положения мыши, при том, что этот объект является верхним с точки зрения Z-индекса, то он назначается целью события - это и будет фаза "цель".
Ну и дальше это событие опять раздается всем объектам-родителям и прародителям целевого объекта - это фаза "всплытия".
По идее, фазу захвата вообще-то лучше было бы спрятать, именно потому, что если этот процесс остановить, то целевой объект может не получить событие. Но тут опять же есть подводные камни - иногда хочется одним махом запретить получать мышиные события всем элементам, или, если не запретить, то остановить - ну те же модальные окна, например. Ну и тут же спорный вопрос, а на сколько приложение в праве решать что делать стейджу, т.е. а хорошо ли это, если какое-нибудь загруженое приложение сможет следить за логикой событий загрузившего приложения и т.п. Не знаю, я не думаю, что тут возможен однозначный ответ, но, мне кажется, что запрещать по умолчанию с возможностью разрешить, если потребуется был бы оптимальный вариант.

Psycho Tiger 20.04.2010 19:23

Да спасибо, это я понимаю. Мне не понятно, зачем фаза цель нужна.
Мы углубились, потом всплыли и всем рассказали...

wvxvw 20.04.2010 20:38

Возможно чтобы не делать:
Код AS3:

event.currentTarget && event.currentTarget === event.target

а вместо этого:
Код AS3:

event.phase === EventPhase.TARGET

А вообще - не знаю, как-то не приходилось пользоваться :)

Psycho Tiger 20.04.2010 22:14

Код AS3:

event.currentTarget && event.currentTarget === event.target

Что, прости? UPD: а, тьфу. Голова нарисовала скобки вот так:
Код AS3:

(event.currentTarget && event.currentTarget) === event.target

и в голове каша случилась )

Да, та же ерунда - не приходилось сталкиваться поэтому и не знаю )

Я так понимаю, что EventPhase.TARGET может быть только у виновника события, все остальные получат EventPhase.BUBBLING, ну некоторые при желании ещё и capture фазу, верно?

dimarik 22.04.2010 02:22

Цитата:

Сообщение от Psycho Tiger (Сообщение 902069)
Я так понимаю, что EventPhase.TARGET может быть только у виновника события, все остальные получат EventPhase.BUBBLING, ну некоторые при желании ещё и capture фазу, верно?

Пример с текстовым полем, дитем спрайта. addEventListener'ом озадачиваем спрайт. Кликаем по текстовому полю. Вопрос. Произойдет ли в листенере спрайта, что
Код AS3:

event.phase == EventPhase.AT_TARGET;

?

Добавлено через 11 минут
Цитата:

Сообщение от wvxvw (Сообщение 901876)
Там достаточно просто чтобы в хендлере была какая-нибудь ошибка пойманая в другом месте, и планы по захвату мира накроются медным тазом.

Олег, я подписываюсь (сторонним объектом) на capture phase, и в его хендлере генерю RTE. Правильно я понял?


Часовой пояс GMT +4, время: 22:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.