FLEX: почему событие прослушивается только компонентом диспетчера? - PullRequest
0 голосов
/ 14 мая 2010

У меня есть родитель (Canvas) со многими детьми (LinkButtons)

LinkButtons запускает событие для связи между ними:

dispatchEvent(new SameBookmarkEvent("SameBookmarkEvent", bookmark.name));

и все кнопки link имеют слушателя

this.addEventListener("SameBookmarkEvent", highlightMe);

...

private function highlightMe(e:SameBookmarkEvent):void {
    //do something
}

Теперь проблема в том, что событие прослушивается только дочерним диспетчером. Другими словами, только ребенок, инициирующий событие, получает его. Мне было интересно, что с ним не так, и если я должен добавить слушателя к родителю (Canvas) ...

Мне в основном нужно, чтобы дети (LinkButton) общались между ними

1 Ответ

2 голосов
/ 14 мая 2010

Да, когда вы добавляете слушателя кнопки в функцию в этом объекте, конечно, только этот объект получит событие. Когда вы вызываете addEventListener с помощью функции highlightMe, вы передаете ссылку на функцию highlightMe в текущей области. Это означает, что на частную функцию в этом классе ссылаются. Но эта функция отличается для каждого нового экземпляра класса.

В ООП каждый объект работает сам по себе и ничего не знает о родителях, поэтому одна кнопка ссылки не должна знать, что помимо нее есть другие кнопки ссылки и что эти кнопки делают. Вместо этого родитель знает, что есть X различных кнопок ссылок, каждая из которых работает в одиночку, но управляется родителем для совместной работы. В этом смысле при работе с событиями всегда следует оставлять обработку событий в родительском объекте - за исключением того, что у вашего пользовательского класса есть обработчики по умолчанию, которые поддерживают работу стандартной процедуры (например, изменение внешнего вида при наведении мыши и т. Д.) Или когда у вас есть пользовательские события которые инкапсулируют другие события.

Таким образом, правильный способ справиться с этим - это иметь один обработчик событий в родительском классе (где вы создаете экземпляры кнопок), который также может определить, к какой кнопке относится событие.

Пример

public class SomeParent extends Sprite
{
    public function SomeParent ()
    {
        var btn:Button;

        for ( var i:uint = 0; i < 100; i++ )
        {
            btn = new Button();
            btn.label = 'Button ' + i;
            btn.addEventListener( MouseEvent.CLICK, clickHandler );

            this.addChild( btn );
         }
     }

     private function clickHandler ( event:MouseEvent ):void
     {
          var btn:Button = event.eventTarget as Button;
          trace( 'Button with id ' + this.getChildIndex( btn ) + ' and label "' + btn.label + '" was pressed.' );
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...