2010-07-16 22 views
1

我有2個文件,1個發送事件,1個接收它(當然除了事件類本身)。沒有收到.AS類發起的事件

我之前完成了這個工作,分派和接收文件都是mxml,但是這一次是the dispatching file is an actionscript class,這次它不工作。動作類是不同的嗎?

下面是一個簡單化的版本

的調度類,只要它的創建調度事件。

public class ASClass extends UIComponent{ 

    public function ASClass(){ 
     dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
    } 
} 

在我的主MXML應用程序,我實例化ASClass這隻要它的創建和主MXML應用程序應該接收回來自動調度事件。但有些東西不行。

protected function appCComplete(event:FlexEvent):void{ 
    addEventListener(MyEvents.FIRE_EVENT, gotEvent); 
    var asClass:ASClass = new ASClass(); 

} 

protected function gotEvent(event:MyEvents):void{ 
     Alert.show("got event");   
} 

回答

2
addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

是相同

this.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

一個偵聽FIRE_EVENT通過this對象調度 - 主MXML應用程序。要監聽從asClass對象發起的事件,您必須在該對象上調用addEventListener。

asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

因此,您不能偵聽從構造函數觸發的事件。以下代碼顯示了偵聽由asClass對象觸發的事件(從構造函數以外的任何位置)的正確方法。

protected function appCComplete(event:FlexEvent):void{ 
    var asClass:ASClass = new ASClass(); 
    asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 
} 

protected function gotEvent(event:MyEvents):void{ 
     Alert.show("got event");   
} 

如果你仔細想想,你可以看到它是有道理的。構造函數用於創建對象 - 事件訂閱者通常對對象完成構建和運行後發生的某些操作/更改感興趣。也就是說,如果需要,可以將對this的引用或函數傳遞給ASClass的構造函數,然後將該函數作爲事件偵聽器從構造函數中分配。

public class ASClass extends UIComponent{ 
     public function ASClass(listener:Function){ 
      this.addEventListener(MyEvents.FIRE_EVENT, listener); 
      dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
     } 
    } 

    var asClass:ASClass = new ASClass(this.gotEvent);//pass the function. 

//or 

    public class ASClass extends UIComponent{ 
     public function ASClass(listenerObj:Object){ 
      this.addEventListener(MyEvents.FIRE_EVENT, listenerObj.gotEvent); 
      dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
     } 
    } 

    var asClass:ASClass = new ASClass(this);//pass the object. 

就個人而言,我不認爲很多場景中我願意走這條路:考慮進行一些重新設計,讓你聽的構造函數返回之後的事件。

+1

@cooper不會有任何競賽條件。主要的一點是你應該調用事件監聽器和調度事件的對象。因此你應該調用'asClass.addEventListener' - 在調用構造函數之前你不能這樣做,asClass'在那個時候是空的。同樣,事件監聽器應在事件分派之前添加 - 但只有在分派對象被創建後才能執行此操作。 – Amarghosh 2010-07-16 04:27:17

+1

_it不會比調度事件的ASClass慢._我不確定我在這裏理解你.. – Amarghosh 2010-07-16 04:30:15