2012-08-22 15 views
0

我想根據函數參數動態調用addEventListener中的函數名稱。flex4使用動態後綴在addEventListener中調用函數

newMod("moduleA", "A");調用但是我得到錯誤TypeError: Error #1006: value is not a function.

我如何可以動態調用此函數的任何建議。我看到周圍使用instance[function]()一些答案,但我不知道如何適用與聽衆,

public function newMod(mdLd,evtTyp,param):void { 
    info = ModuleManager.getModule(mdLd); 
    var mevth:String = ("modEventHandler"+(evtTyp)); 
    info.addEventListener(ModuleEvent.READY, function(e:ModuleEvent){ 
       this[mevth](e, param)}); 
    info.load(null, null, null, moduleFactory); 
} 
private function modEventHandlerA(e:ModuleEvent):void { 
    vg1.addElement(info.factory.create() as IVisualElement); 
    } 

[編輯] 貌似改變呼叫this[mevth]()作品,但我似乎無法通過額外PARAMS需要即this[mevth](parm),歡迎任何建議。

我也更新了監聽器包括一個函數調用,但仍然沒有喜悅

回答

1

當您創建關閉「本」並不指向真實的實例「這個」。你可以寫這樣的東西

public function newMod(mdLd,evtTyp,param):void { 
    info = ModuleManager.getModule(mdLd); 
    var self:Object = this; 
    var mevth:String = ("modEventHandler"+(evtTyp)); 
    info.addEventListener(ModuleEvent.READY, function(e:ModuleEvent){ 
       self[mevth](e, param)}); 
    info.load(null, null, null, moduleFactory); 
} 

... 

但我真的不建議你寫這樣的代碼。

+0

thx爲迴應,你能提出一個更好的代碼格式嗎?我不明白朮語「封閉」,你可以指向一些信息,所以我可以理解這一點。 thx藝術 –

+0

thx給這個正確的答案,因爲它做了什麼被問到和指出它可能會更好,thx藝術 –

0

要awnser您的評論:

功能封閉結構的功能會記住它已經創建的上下文。在你的下面的一行代碼創建一個封閉:

info.addEventListener(ModuleEvent.READY, function(e:ModuleEvent){ 
      this[mevth](e, param)}); 

的事件處理函數中包含方法public function newMod(mdLd,evtTyp,param):void類的情況下創建的,因此處理程序可以訪問類的所有成員。這包括在周圍方法中聲明的變量,類的私有變量/方法以及類的整個繼承鏈中的受保護變量/方法。

this伊萬亞琴科寫的問題是,你的處理函數實際上是頂級類Function的一個實例。因此,如果您嘗試在函數對象中調用this上的方法,它將與調用任何其他對象中的方法相同 - this引用該對象。在你的情況下,這將是Function對象。但是你的函數沒有你想調用的方法。

此外,您將遇到與您的代碼的另一個問題。因爲您創建內聯事件處理程序 - 直接作爲addEventListener()的參數,您將無法在稍後移除事件偵聽器。您應該使用addEventListener()上的useWeakReference參數,如here所述,或者將處理函數存儲在變量中以保存其中的引用,以便隨後使用removeEventListener()將其刪除。

+0

thx @freakazoid_em大量的詳細信息,那裏將需要一些時間來消化。我會試着逐步解決問題,並回答我是否會陷入死衚衕。 –