0

我有 3 节课:

识别 URL 变化的类(使用 Asual 的 SWFAddress):

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();
 }
}
}

完成后验证 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 是否有机会收到有关完成由其他类触发的验证的信息?

4

1 回答 1

1

您正在创建调度程序的两个不同实例,因此被调用以验证您的 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();
于 2011-10-17T11:56:48.917 回答