Flex Custom Event рассылка - PullRequest
       11

Flex Custom Event рассылка

1 голос
/ 11 октября 2010

У меня есть вопрос об отправке событий в flex.

Моя цель - загрузить пользовательское событие с некоторыми данными, а затем отправить его в список событий.

мое основное приложение имеети запрос на обслуживание AMF, внутри которого вызывается класс обслуживания.Предполагается, что этот класс отправляет событие, когда запрос службы AMF возвращает результат или ошибку, и основное приложение прослушивает это событие.

, поэтому в моем mainapp я добавляю и слушаю вот так:

this.addEventListener("UserInfoEvent", userInfoHandler);

пользовательский UserInfoEvent.as выглядит следующим образом

package events
{
 import flash.events.Event;

 import logic.Ego;

 public class UserInfoEvent extends Event
 {
  private var ego:Ego;

  public function UserInfoEvent(type:String, ego:Ego)
  {
   super(type);
   this.ego = ego;
  }

  override public function clone():Event 
  { 
   return new UserInfoEvent(type, ego);
  } 
 }
}

и, наконец, диспетчер внутри класса AMF Service выглядит следующим образом:

private var dispatch:EventDispatcher = new EventDispatcher;  
var userInfoEvent:UserInfoEvent = new UserInfoEvent("UserInfoEvent", ego);
dispatch.dispatchEvent(userInfoEvent);

Однако это событие никогда не достигаетОсновное применение.Присмотревшись к нему с помощью отладчика, я обнаружил, что когда событие отправляется, его свойство listeners устанавливается в null.

Может кто-нибудь сказать мне, что я делаю неправильно?

Ответы [ 5 ]

3 голосов
/ 12 октября 2010

Вы не правильно слушаете событие, как я его вижу.

 // you have 
 this.addEventListener("UserInfoEvent", userInfoHandler);

 // but you dispatch the event from    
 dispatch.dispatchEvent(userInfoEvent);  

что не так

Вам нужно что-то вроде

instance_of_Dispatch.addEventListener();  // because this != dispatch
3 голосов
/ 11 октября 2010

Я думаю, что ваше событие не будет поймано, потому что оно не пузырится

вместо

super(type);

попробовать

super(type, true, false);

Если вы вызываете конструктор Event с одним аргументом, он по умолчанию имеет значение false для двух других аргументов, один из которых - пузыри.

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

1 голос
/ 11 октября 2010

Таким образом, события во Flex идентифицируются по именам строк. У вашего класса Event нет «имени», поэтому у него нет никакого способа его идентифицировать и сопоставить, когда он отправлен. Это «имя» - это то, что передается в параметр «тип» конструктора. Он традиционно хранится и упоминается как статическая константа. Поскольку вы сравниваете объект класса UserInfoEvent со строкой «UserInfoEvent», он никогда не совпадает и не обнаруживает, что это событие, которое вы хотите обработать.

package events
{
    import flash.events.Event;

    import logic.Ego;

    public class UserInfoEvent extends Event
    {

        public static const MY_EVENT:String = "myEvent";
        private var ego:Ego;

        public function UserInfoEvent(type:String, ego:Ego)
        {
            super(type);
            this.ego = ego;
        }

        override public function clone():Event 
        { 
            return new UserInfoEvent(type, ego);
        } 
    }
}

И тогда вы прослушаете / отправите это событие, используя:

dispatchEvent(new UserInfoEvent(UserInfoEvent.MY_EVENT));

и

addEventListener(UserInfoEvent.MY_EVENT, myEventHandler);

Надеюсь, это имеет смысл, сейчас я борюсь с неприятной мигренью, и это убивает мою способность использовать слова: P

0 голосов
/ 12 октября 2010

ОК, похоже, что все были частично правы.

Вот полное решение:

MainApplication.mxml Важно отметить, что это работает, только если класс обслуживания расширяетсякласс sprite, в противном случае вы не можете использовать метод addEventListener.Похоже, другое решение для этого заключается в реализации IEventDispatcher

private var service:MyService = new MyService;
this.service.addEventListener(UserInfoEvent.RESULT, userInfoHandler);

UserInfoEvent.as

package events
{
    import flash.events.Event;
    import logic.user.Ego;

    public class UserInfoEvent extends Event
    {
        private var ego:Ego;
        public static var RESULT:String = "resultEvent";

        public function UserInfoEvent(type:String, ego:Ego)
        {
            super(type,  true, false);
            this.ego = ego;
        }

        override public function clone():Event 
        { 
            return new UserInfoEvent(type, ego);
        } 
    }
}

И, наконец, как уже упоминалось, спрайт расширен MyService.as

public class MyService extends Sprite
{
...
userInfoEvent = new UserInfoEvent(UserInfoEvent.RESULT, ego);
dispatchEvent(userInfoEvent);

так что у меня сработало.Спасибо за вашу помощь, ребята, я отмечу ответ Адриана как правильный, поскольку он дал мне направление.

0 голосов
/ 11 октября 2010

Я предполагаю, что ваш диспетчер событий связан с systemManager, а не через главное приложение, поскольку ваш диспетчер не добавляется как дочерний элемент основного приложения. Попробуйте добавить слушателя в systemManager, а не в основное приложение:

this.systemManager.addEventListener("UserInfoEvent", userInfoHandler);
...