Можно ли прослушать событие, вызванное другим классом? - PullRequest
0 голосов
/ 16 октября 2011

У меня есть 3 класса:

Класс, который распознает изменение в URL (используя SWFAddress от Asual):

package swfaddress {

import flash.display.MovieClip;
import com.asual.swfaddress.*;

 public class SwfAddress extends MovieClip {

 private var dispatcher:Dispatch = new Dispatch;

 public function SwfAddress():void {
  SWFAddress.addEventListener(SWFAddressEvent.CHANGE, onChange);
 }

 private function onChange(e:SWFAddressEvent):void {
  dispatcher.changed();
 }
}
}

Класс "Dispatch", который проверяет URL иДиспетчерское событие после завершения

package swfaddress {
 import flash.events.Event;
 import flash.events.EventDispatcher;

 public class Dispatch extends EventDispatcher {

  public static const CHANGED:String  = "changed";

  public function changed ():void {

    // some operations validating the URL

   dispatchEvent(new Event(Dispatch.CHANGED));
  }
 }
}

Другой класс в другом пакете, который должен получать информацию после завершения процесса проверки.

package menu {
import swfaddress.*

public class MenuPanel extends MovieClip {
var swfRead:Dispatch = new Dispatch;

public function MenuPanel():void {
 swfRead.addEventListener(Dispatch.CHANGED, onChange);
}

private function onChange(e:Event):void {
 trace("Hello World");
}
}

И «Hello World» никогда не появлялся в окне вывода- поэтому я не уверен, возможно ли, что у моей MenuPanel есть шанс получить информацию о завершении проверки, инициированной каким-либо другим классом?

1 Ответ

1 голос
/ 17 октября 2011

Вы создаете два разных экземпляра диспетчера, и поэтому экземпляр, который вызывается для проверки вашего URL, не совпадает с экземпляром, который вы слушаете в классе MenuPanel.

Простой способ обойтиэто делается для того, чтобы сделать класс Dispatch одноэлементным, так что существует только один его экземпляр, и вы можете ссылаться на него из разных точек вашего приложения.Это работает путем предоставления классу Dispatch статического метода, который возвращает автономный экземпляр самого себя.Затем вы вызываете Dispatch.getInstance() всякий раз, когда хотите получить ссылку на класс вместо использования ключевого слова new.

Отправка:

package swfaddress
{
    import flash.events.Event;
    import flash.events.EventDispatcher;


    public class Dispatch extends EventDispatcher
    {
        // singleton instance
        private static var _instance:Dispatch;
        private static var _allowInstance:Boolean;

        public static const CHANGED:String  = "changed";

        // get singleton instance of Dispatch
        public static function getInstance():Dispatch 
        {
            if (Dispatch._instance == null) {
                Dispatch._allowInstance = true;
                Dispatch._instance = new Dispatch();
                Dispatch._allowInstance = false;
            }
            return Dispatch._instance;
        }

        public function Dispatch() 
        {
            if (!Dispatch._allowInstance)
            {
                throw new Error("Error: Use Dispatch.getInstance() instead of the new keyword.");
            }
        }

        public function changed():void {
            //some operations validating the URL
            dispatchEvent(new Event(Dispatch.CHANGED));
        }
    }
}

Получение справки:

private var dispatcher:Dispatch = Dispatch.getInstance();
...