2011-01-11 97 views
2

我在派發正確調度的模型類中的事件時遇到問題。當試圖在客戶端收聽這些內容時,不會收聽任何內容。 Client.as實例化所有MVC元素如:在模型(MVC)中調用dispatchEvent時,addEventListener不起作用AS3

var _biosModel:IMultiDataModel = new BiosPanelModel(); 

用戶點擊調用「BiosPanelModel.as」內的「更新」方法,像這樣:

override public function update():void 
{ 
    debug("[BiosPanelModel.update]"); 
    dispatchEvent(new Event(Event.CHANGE)); // dispatch event 
} 

Client.as然後試圖聽這個派出的事件,但沒有,我不知道爲什麼!?像這樣:

this._biosModel.addEventListener(Event.CHANGE, eventHandler); 

eventHandler is not called!

希望有人能幫助我,因爲我覺得這應該很簡單! :-(

感謝您閱讀

克里斯

回答

3

我會試圖通過設置bubbles參數設置爲true開始那麼,調度事件,像這樣:

dispatchEvent(new Event(Event.CHANGE, true)); 

這將保持您不必在調度程序上明確地收聽事件,並且可以在冒泡階段捕獲事件。

編輯
不是最終所有,是所有答案......你可能會想要刪除bubbles =真正一旦你得到它正常工作,除非你想明確地取消你後的事件捕獲它。原因在於Event.CHANGE事件是一個非常常見的事件,並且將該事件向上顯示列表鏈冒泡可能會很麻煩,特別是如果有其他處理程序正在偵聽CHANGE事件。但是,它讓你知道你是否正確地連接你的聽衆。
編輯完

你可能想嘗試(因爲它是不是從你上面寫代碼的方式明顯)的另一件事是創建實例後立即添加事件監聽器。另外,請確保您的_biosModel是一個實例屬性,未在生成它的某個函數的範圍內定義。

package ... { 

    import flash.events.Event;  

    public class Something extends SomethingElse { 

     var _biosModel:IMultiDataModel; 

     public function Something() { 
      this._biosModel = new BiosPanelModel(); 
      this._biosModel.addEventListener(Event.CHANGE, __eventHandler); 
     } 

     private function __eventHandler($evt:Event) { 
      trace("SUCCESS"); 
     } 
    } 
} 
+1

Bang on。泡沫是關鍵。 – 2011-01-11 18:11:56