2010-03-23 32 views
1

我有麻煩搞清楚如何構建我的應用程序控制臺,所以我可以從包中的任何類發封郵件給它。的Flash AS 3.0建立一個消息控制檯方式

我試圖發送一個普通的事件,但我不能找到一種方法一起發送味精與事件,或者至少被調度事件的對象的引用。

你會建議什麼辦法?

+0

抓事件查看跟蹤我回答下面的問題以跟進問題 – vasion

回答

0

最簡單的方法是創建一個DynamicEvent類,你可以添加你想要的任何消息。

package { 
    import flash.events.Event; 
    dynamic public class DynamicEvent extends Event { 
     public function DynamicEvent(t:String, b:Boolean = false, c:Boolean = false){ 
      super(t, b, c); 
     } 
    } 
} 

通過設置這個類是動態的(使用動態關鍵字),您可以將值添加到您的活動對象:

var _dynEvent:DynamicEvent = new DynamicEvent(LOAD_PROGRESS); 
_dynEvent.id = _id; 
_dynEvent.bytesLoaded = bytesLoaded; 
dispatchEvent(_dynEvent); 

然後,當你聽的事件:

function eventHandler(e:DynamicEvent):void{ 
    trace(e.bytesLoaded); 
    trace(e.id); 
} 
+0

您可能需要重寫事件的clone()方法 - 請參閱http://www.bit-101.com /博客/ P = 1143。動態事件可能會非常棘手。 – Cameron

+0

@Cameron:你可以在for-in循環中獲取所有動態屬性。 @danjp:不會那樣做。相反,有一個''''''''''數據類型的屬性'''存儲與事件一起傳遞的所有數據。這樣就不會與'Event'的屬性(例如'type'或'target')發生衝突。 – back2dos

+0

@Cameron @ back2dos - 是的,你是對的。儘管這很容易和簡單(閱讀'快速和骯髒'),雖然我不會爲任何大型項目執行此操作,但對於此項目而言,這是一個很好的機會。 – danjp

3

使用動態關鍵字的自定義事件將按照Danjp的帖子所宣傳的那樣工作,但我會建議在任何類型的大型項目上使用它。例如,你失去了嚴格鍵入你的信息有效載荷的能力 - 如果其他人必須編輯你的代碼,他們可能不知道你的事件上有一個動態生成的「myData」屬性。對於稍後嘗試編輯您的代碼的人來說,這將會引起頭痛。

「正確」的方式做,這是創建與保存數據強類型成員自定義事件。例如:

package com.yourdomain.events { 
    import flash.events.Event; 
    import com.yourdomain.model.vo.MyValueObject; 

    public class MyEvent extends Event { 
     public var myVO:MyValueObject; 
     public function MyEvent(type:String):void { 
      super(type); 
     } 
    } 
} 

所以,是的 - 這簡直就是這樣。你會想要google的確切格式,我的簡化 - 你的super()調用應該有其他參數,並且你想要覆蓋clone()方法。但是這裏的優點是任何檢查你的代碼的人都知道什麼樣的數據類型可以作爲有效載荷來查找。在這種情況下,它是MyValueObject的一個實例。

讓我知道,如果你有關於爲什麼任何具體問題,但這是一般的想法。每當你做一個大型的AS3項目時,你都會希望使用這樣的自定義事件來不僅分派各種通知,而且還要攜帶明確定義的嚴格類型的數據有效載荷。

+0

請看看我發佈的代碼。我仍然困惑 – vasion

0

我試了一下你們的建議..這是我的事件代碼

public class ConsoleEvent extends Event 
{ 
    public var variable: String; 
    public function ConsoleEvent(variable1: String, type:String='message',bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
     this.variable = variable1; 
    } 
    override public function clone():Event 
    { 
     return new ConsoleEvent (variable,type, bubbles, cancelable); 
    } 

} 
} 

但這

[Event type="message" bubbles=false cancelable=false eventPhase=2] 

我有

reader.addEventListener('message', consoleadd); 
+0

是的,你做得很好 - 在你的「consoleadd」函數中,而不是說「trace(event)」說「trace(event.variable)」。 你在那裏有一個實際事件對象的蹤跡,它給你所有的標準事件信息。如果你願意,你可以在你的自定義事件中重寫public function toString():String以除了type,bubbles,cancelable和phase之外的變量。如果這是有道理的。 但是,是的,你的處理程序中的event.variable會給你你想要的! – Myk