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

ディスパッチャの 2 つの異なるインスタンスを作成しているため、URL を検証するために呼び出されているインスタンスは、MenuPanel クラスでリッスンしているインスタンスと同じではありません。

これを回避する簡単な方法は、Dispatch クラスをシングルトンにして、そのインスタンスが 1 つだけ存在し、アプリケーションのさまざまなポイントから参照できるようにすることです。これは、自己完結型のインスタンスを返す静的メソッドを 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 に答える