#flash #actionscript-3 #delegation
#flash #actionscript-3 #делегирование
Вопрос:
Я новичок во Flash, и у меня возникли некоторые проблемы:
Итак, у меня есть свой класс Main, который импортирует класс NavMenu. Для выбранного элемента есть событие, которое запускает функцию, в которой я пишу:
dispatchEvent(new Event('my_event'));
В моем основном классе, в конструкторе, который я объявил
addEventListener('my_event', my_event_handler);
и у меня есть обработчик событий, в котором я хочу удалить некоторые дочерние элементы со сцены:
private function my_event_handler(event:Event):void
{
trace("my Event");
}
И ничего не происходит, может кто-нибудь сказать мне, что я делаю не так?
Спасибо
Ответ №1:
вам нужно назначить прослушиватель объекту, который его отправляет. Из вашего кода неясно, что что делает, но, например, в вашем основном:
//класс Main
var _newClass:NewClass = new NewClass();
_newClass.addEventListener("my_event"), handler);
а затем отправка события в NewClass
//class NewClass
this.dispatchEvent(new Event("my_event"));
прямо сейчас вы, кажется, запускаете событие нормально, но вы добавляете прослушиватель не к тому объекту (в данном случае, я думаю, к основному классу, который также не выполняет отправку).
Обратите внимание, что если вы отправите событие в конструкторе NewClass , вы, вероятно, пропустите событие, поскольку вы будете назначать прослушиватель после запуска события. Поэтому запустите его в другом месте.
- Обновить —
Как отметили @redconservatory и @Prototypical, в этом сценарии можно использовать пузырьковый режим. Однако существуют некоторые ограничения.
Обычно, если параметр use_capture == false
(по умолчанию) в методе EventListener sig, вам действительно нужно напрямую настроить таргетинг на объект для получения событий. Чтобы включить фазу пузырьковой обработки :
this.addEventListener("my_event", handler, true); //use_capture == true
Родительский элемент дочернего элемента, который отправляет событие, теперь станет подходящей целью события, поскольку оно «всплывает» обратно вверх по иерархии. И в этом случае ответ @redconservatory верен. Важным исключением здесь является то, что пузырьковая обработка доступна только для DisplayObjects. NewClass должен расширять DisplayObject или предка и добавляться в список отображения для правильной работы с пузырьками.
из LiveDocs
Захват и создание пузырьков происходят по мере того, как объект события перемещается с узла на узел в отображаемом списке: от родителя к потомку для захвата и от потомка к родителю для создания пузырьков. Этот процесс не имеет ничего общего с иерархией наследования. Только объекты DisplayObject (визуальные объекты, такие как контейнеры и элементы управления) могут иметь фазу захвата и фазу создания пузырьков в дополнение к фазе нацеливания.
Для полного обсуждения очень важной темы распространения событий ознакомьтесь с этим введением в обработку событий.
Комментарии:
1. Этот ответ и информацию о пузырьковании в другом ответе, вероятно, следует объединить для получения окончательного ответа. Оба будут работать (при условии, что его навигационное меню действительно подключено к основному классу), но не кажется правильным исключать ни одно из решений. Я бы предложил немного объяснить пузырящийся процесс.
Ответ №2:
Попробуйте перенести событие в основной класс
dispatchEvent(new Event('my_event', true)); // "true" sets bubbling to true
И в addEventListener создайте прослушиватель на этапе Main:
stage.addEventListener('my_event', my_event_handler);