![]() |
MovieClip не принимает сообщение от родителя
Вложений: 1
Есть два класса - app (главный класс флэшки) и receiver (класс находящегося на сцене movie clip, по сути - потомок app);
app посылает сообщение и задача receiver - его услышать. receiver его не слышит. Полагаю, я плохо понимаю механизм посылки сообщений. Если кто либо может взглянуть на пример кода и поправить меня, буду очень благодарен. В приложенном файле весь пример целиком, а вот сам код app: Код:
package{Код:
package{ |
ты же пиши кому извещать..
создай например глобальный инстанс и к нему крепи листенеры.. |
Что значит "пиши, кому извещать"? Извещает app. Он - верхний в иерархии класс, глобальнее вроде некуда. А если "кого извещать" - если бы app знал имена потомков то не было бы смысла в сообщениях - проще методы потомков вызывать
|
можно написать :
Код:
root.addEventListener('APP_PROGRESS', onMessage);Код:
dispatchEvent(new Event('APP_PROGRESS',true));Я хочу понять принцип ошибки - где я не понял теорию? - иначе то что я делаю больше похоже на хак. |
Цитата:
Цитата:
ps: Названия классов пишутся с большой буквы, а обработчики приватные немешало бы сделать. |
А кто вас так научил классы называть и не научил кастомным событиям?
|
Знаю как сделать чтоб работало, но не понимаю почему не работает этот пример. Присоединяюсь к вопросу автора
|
Нужно использовать всплывающие события. Никаких хаков тут нет, событие от детей поднимается вверх по родителям. Если не использовать bubbling, то событие попадет только в те обработчики, которые были подписаны непосредственно у того, кто шлет событие.
|
akerka,
проблемы с твоим кодом возникают из-за идеологически неверно простроеных отношений между классами. Добиться работоспособности можно, используя bubbling и targeting. Но код в итоге получится корявым. Что делать: 1. Переименовать. Да-да. Нет слова app в английском. А сократить так можно и appendix и application и, думаю еще не одно слово. Код пишется в первую очередь для человека. Ну, и учесть, что имена классов начинаются с большой буквы. Это - самое важное. Остальное мелочи. 2. Где-то у тебя создается экземпляр класса receiver (но мы договорились, что переименуем этот класс на более понятное, что-то типа ApplicationPreloaderReceiver). Вот там, где он создается, и нужно передать ссылку на экземпляр класса ныне именуемого app. И, затем, подпишемся на его события. зачеркнуто И, затем, подпишем его на события этого класса. /зачеркнуто 3. В коде мы не будем использовать строки и навешивать нехарактерное вещание на класс Event. Просто создадим класс - наследник Event, например ApplicationPreloaderEvent и создадим в нем публичную статическую константу APPLICATION_PROGRESS:String = "applicationProgress" и в дальнейшем в коде будем использовать только ее для вещания событий этого типа. Примерно так. Теоретически возможно, что передать ссылку на экземпляр app будет затруднительно. В этом случае, коль уж это так тяжело, этот класс следует во-первых переименовать например: MyFirstApplication, а во-вторых сделать его синглтоном и подписываться на событие используя получение ссылки через getInstance(). Впрочем, это не рекомендуемая практика. удачи. |
2. Каким образом? Откроем всем ветрам приватные обработчики событий?
Чем это бабблинг корявый вдруг стал? |
п.2 спасибо, Денис. Там была ошибка по тексту. Исправил.
Баблинг не стал корявым. И тут я ошибся, только в другую сторону: с помощью баблинга вроде как нельзя проинформировать детей. Так что описаная ситуация невозможна. Впрочем, я могу ошибаться, не проверял. Вообще, что касается событий, я бы сказал, что это штука довольно мощная, однако подходить к использованию событий надо с умом и осторожностью. Теоретически, все вызовы методов можно заменить событиями, однако этого никто не делает, поскольку это усложняет восприятие логики приложения. Соответственно есть некая грань, которую нужно довольно четко понимать и думать, а стоит ли использовать именно событие. |
Думаю уместно задать здесь свой вопрос.
Читаю справку и блок Constantiner-a пытаюсь разобраться с Event flow. Я представляю себе это так: есть некий объект из дисплэй листа, сам по себе он никагого события из вне отловить не может (естественно), например, нажатие мыши. Флэш плеер говорит этому объекту, знаешь, дорогой генери такое-то событие. (В АС2 было только так). Но в АС3 это событие исходит не сразу от объекта источника, а движется от среды (Flash Player) к этому объекту. Не спроста есть свойство target, название которого как-то замыливается, но если подумать, почему объект стал целью, если он источник. А вот оказывается, он "цель" для события которое имеет точку входа stage. Это что касается событий которые "из-вне" (клики, загрузка, девайсы...) Тут мне все понятно, процессом можно управлять: "пузырить", "не пузырить", прекращать распространение и тд. Не понятно есть ли какой-то поток событий для событий генерируемых "внутри"? Или тут урезанная программа возможна только стадия пузырька? Код:
stage.sprite1.sprite2.sprite3.dispatchEvent(new Event("testEvent", true)); |
Цитата:
Что касается вызовов методов, то я по своему опыту могу сказать, что у меня прямые вызовы методов составляют где-то процентов 30 от всех… terbooter, не очень понял твой вопрос. |
Если коротко, то:
Существует ли поток событий если объект генерит событие с помощью dispatchEvent |
Цитата:
Вообще говоря, ничего сложного в работе EventDispatcher нет. |
Никак не могу сделать примерчик, где событие генерится dispatchEvent,
а у какого-нибудь слушателя оно отрабатывается при этом target != currentTarget или eventPhase != 2; Пытаюсь делать так: Код:
//пишу код прямо в кадре для быстроты |
(кастомный ивент мне было лень писать):
Код:
package {Код:
package {Код:
[Event type="custom" bubbles=true cancelable=false eventPhase=3] |
Мой пример тоже заработал !
Код:
stage.addEventListener("testEvent",testEventHandler); |
Цитата:
|
Прям копи-пастом:
Для передачи событий из View (MVC) удобно использовать bubbling в сочетании со stopPropagation() там, где не требуется дальнейшее всплытие события. В итоге все события View отлавливаются в Main и далее перенаправляются куда требуется. |
Цитата:
|
1 событие должно быть с баблингом
2 ты просто в рутовом классе пишешь addEventListener(MyMenuEvent.NOTIFY, onItemNotify); примерно так |
| Часовой пояс GMT +4, время: 18:20. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.