2009-05-24 4 views
5

Я проделал много чтения через сообщения и учебники форума, но я все еще не могу обернуть мозг вокруг событий и прослушивателей событий. У меня довольно простой пример, но я не могу заставить его работать.добавление пользовательского прослушивателя событий в as3

У меня есть массивСоздание пользовательских объектов в ретрансляторе, когда один из этих объектов нажат, я хочу, чтобы другой компонент отображал данные, связанные с этим объектом.

Вот что у меня есть, но слушатель никогда не отвечает (диспетчер, похоже, работает, потому что новое событие создано, и я вижу трассировку с правильным выходом.) Я подозреваю, что это происходит, потому что когда я вызываю addEvent Слушатель, я делаю это на неправильном объекте. Я понимаю, что объектом, который будет отображать данные объекта, является объект, который должен иметь прослушиватель событий, и слушать все события такого рода, но, возможно, я неправильно понял.

Мой заказ событие:

public class SelectObjectEvent extends Event 
    { 
     public function SelectObjectEvent(customEventString:String, myObject:customObject) 
     { 
       super(customEventString, true, false); 
       trace(customEventString+" "+myObject); 
     } 
    } 
} 

Мой пользовательский объект имеет следующую функцию, которая вызывается по щелчку:

public function selectObject(myObject:customObject):void 
     { 
      dispatchEvent(new SelectObjectEvent("OBJECT_SELECTED", customObject));    
     } 

И компонента Я хочу, чтобы отобразить выбранный объект имеет следующий конструктор:

public function SelectedObjectDisplayClass() 
     { 
      addEventListener("OBJECT_SELECTED", this.showObject) 
     } 

     public function showObject(event:Event):void 
      { 
      trace("Show object: "+event); 
     } 

ответ

3

Не совсем ясно, где находятся ваши последние два фрагмента кода ar e, но похоже, что вам нужно позвонить addEventListener на объект, который расширяет EventDispatcher.

То есть, если ваш второй кусок принадлежит к пользовательскому объекту под названием Clickable, который простирается EventDispatcher и вызывает dispatchEvent() при нажатии, то ваш компонент должен быть вызовом myClickable.addEventListener(...) где myClickable является экземпляром Clickable. Имеет ли это смысл?

Но если ваш третий кусок кода не совпадает с тем же классом, что и второй, это не похоже на то, что вы это делаете. Вы добавляете слушателя к классу, которому принадлежит третий кусок кода, который я собираю, не тот, который расширяет EventDispatcher.

+0

Ну ... да, второй кусок принадлежит к объекту, который отправляет событие, но это не интерактивное, и оно не распространяется EventDispatcher, насколько я знаю (она расширяет UIComponent.) Это который находится в компоненте List. Когда этот объект в списке выбран, он отправляет свое событие. Каждый объект, который отправляет событие, должен расширять EventDispatcher? – Martholomew

+0

Может быть, моя проблема в том, что List должен отправить событие с выбранным объектом в аргументе? – Martholomew

+1

Ну, DisplayObject расширяет EventDispatcher, поэтому все, что у вас есть на сцене, также будет. Я не знаю, кто должен отправить мероприятие - кто бы ни знал, когда это делать, я полагаю, но это зависит от вашего кода. Определенно, что если A отправляет событие, а B получает его, тогда ваш вызов должен быть некоторым .AdadEventListener (eventType, someB.method). Сейчас у вас, кажется, есть B, добавляющий к себе прослушиватель событий. – fenomas

0

Просто взгляните на свой код и обратите внимание, что ваш второй параметр dispatchEvent является классом, а не экземпляром объекта. Разве это не должно быть myObject?

public function selectObject(myObject:customObject):void 
     { 
       dispatchEvent(new SelectObjectEvent("OBJECT_SELECTED", **customObject**));       
     } 
Смежные вопросы