2008年12月30日 星期二

RIA 設計小技巧 (使用自訂事件)

如果你目前在寫一些ActionScript3.0 based RIA的程式, 但是你卻是寫在影格上或是視窗間要溝通時設計成互相知道對方的話, 你應該要學起來下面的做法, 基本上這已經是標準動作了。

首先創建ModelLocator, 它的作用等於所有事件的轉運站, 所以內部採用Singleton模式, 外部調用時使用static方法getInstance(), 尚未創建則創建並返回, 若已經存在則返回該物件。

package {
    import flash.events.EventDispatcher;

    public class ModelLocator extends EventDispatcher {

        private static var _instance:ModelLocator;

        public function ModelLocator() {
        }

        public static function getInstance():ModelLocator {
            if (! _instance) {
                _instance = new ModelLocator();
            }
            return _instance;
        }
    }
}

再來是自訂事件CustomEvent, 它繼承Event使用type字串作為旗標, 第二個參數為varargs, 可以定義符合自己需求的data.

package {
    import flash.events.Event;

    public class CustomEvent extends Event {

        public var data:* ="default data";// default data  
        public var msg:* ="default msg";// default message  
        
        // EventType, data, message  
        public function CustomEvent(type:String, ... args) {
            super(type, true, true);
            if (args) {
                if (args[0]!=undefined) {
                    this.data=args[0];
                }// if( args[1] != undefined ) this.msg = args[1];  
                // 以此類推  
            }
        }
    }
}

使用方式為:

發送:

model.dispatchEvent( new CustomEvent("RECEIVE_OK", "you've send a message") );

接收:

var model:ModelLocator = ModelLocator.getInstance();  
model.addEventListener("RECEIVE_OK", onReceiveOK);  
function onReceiveOK(evt:CustomEvent):void  
{  
    trace(evt.data);  
}

用完一樣要適時的removeEventListener, 否則會造成資源浪費。

2 則留言:

  1. 您好,初學者看到您這篇文章,覺得很棒,
    但請教一下有關文章中發送的內文是什麼呢?
    期待您的回覆!

    回覆刪除
  2. 發送與接收就是下面兩塊

    發送:
    model.dispatchEvent....

    接收:
    var model:ModelL...

    回覆刪除