Пузырьки событий действительно работают только в иерархии DisplayObject
, а для пользовательских событий - только ограниченным образом.
Думайте об этом так:
У экранного объекта есть родительский объект (за исключением рабочей области). Если ваш ребенок отправляет событие, имеет смысл, что это может относиться ко всему, что его содержит. Если у меня есть компонент со специальной кнопкой, которая отправляет событие «foo», я буду слушать компонент, даже если кнопка отправила событие.
С другой стороны, общие IEventDispatcher
не имеют родительских отношений. Если у меня есть пользовательский объект данных, а другой объект, который является свойством этого объекта, отправляет событие, то нет смысла заставлять контейнер отправлять событие (если это не указано специально). Черт, содержащийся объект может даже не знать, что содержащийся в нем объект является диспетчером! Кроме того, если контейнер отправляется каждый раз, когда отправляется частное свойство, это в очень коротком порядке приведет к рекурсивной диспетчеризации событий и переполнению страшного стека.
Но почему я сказал, что оно ограничено?
MouseEvents пузырь. Это понятно. Но пользовательские события часто не всплывают так же, как MouseEvents. Когда MouseEvent всплывает, у него есть две фазы: фаза захвата и фаза не захвата (не знаю, как это называется). Фаза захвата начинается в root
и проходит в фактическую диспетчеризацию DisplayObject
, тогда как другая фаза начинается в DisplayObject
, а затем проходит в root
.
Я часто обнаруживал, что фаза захвата пропускается при отправке события из пользовательского компонента. Обычно это не имеет значения, но влияет на случай с нечетным углом, так что стоит остерегаться.