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.
就個人而言,我不認爲很多場景中我願意走這條路:考慮進行一些重新設計,讓你聽的構造函數返回之後的事件。
@cooper不會有任何競賽條件。主要的一點是你應該調用事件監聽器和調度事件的對象。因此你應該調用'asClass.addEventListener' - 在調用構造函數之前你不能這樣做,asClass'在那個時候是空的。同樣,事件監聽器應在事件分派之前添加 - 但只有在分派對象被創建後才能執行此操作。 – Amarghosh 2010-07-16 04:27:17
_it不會比調度事件的ASClass慢._我不確定我在這裏理解你.. – Amarghosh 2010-07-16 04:30:15