Показать сообщение отдельно
Старый 24.05.2018, 11:53
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 14  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Наконец-то сел почитать, чтобы разобраться с Событиями досканально - многое прояснил для себя.
Но есть момент, в котором не знаю как правильно поступить: как раз столкнулся на моем примере, когда по совету от caseyryan стал не создавать свое новое событие, а передиспатчивать существующее - dispatchEvent(e).

Мне нужно ловить событие клика по спрайту _box, который внутри класса ImageBox.

Код AS3:
public class ImageBox extends Sprite
{
     private var _box:Sprite; // в этом спрайте рисуется бэкграунд и грузится картинка
     private var _cb:CheckBox; // чекбокс
 
     public function ImageBox()
     {
          _box = new Sprite();
          _box.addEventListener(MouseEvent.CLICK, onClickHandler);
          addChild(_box);
 
          _cb = new CheckBox();
          addChild(_cb);
     }
 
     private function onClickHandler(e:MouseEvent):void
     {
          dispatchEvent(e);
     }
}
Код AS3:
_imageBox = new ImageBox();
_imageBox.addEventListener(MouseEvent.CLICK, onClick);
addChild(_imageBox);
 
private function onClick(e:MouseEvent):void
{
     trace(e.target); // выводит [object ImageBox] и [object Sprite]
}
В итоге обработчик onClick срабатывает два раза.
Как я понимаю:
ImageBox имеет событие click, унаследовав от Sprite. И _box тоже. Подписавшись на событие click у _imageBox - из-за цепочки событий в иерархии отображаемых объектов на фазе захвата происходит диспатч сначала у предка [object ImageBox], а потом и у получателя [object Sprite].
Верно ли понимаю?

Вопрос: мне не нужно чтобы onClick срабатывал дважды, т.к. в нем будут производиться какие-либо действия дважды.. Вижу два выхода: 1) в обработчике проверять от кого пришло событие и только после этого выполнять дальнейшие действия. 2) либо все таки в onClickHandler диспатчить свое событие.

Подскажите пожалуйста.
__________________
кто не отвечает, того garbage collector забирает