2012-10-24 57 views
8

我正在尋找從cfscript中的不同組件動態調用方法的最佳方法。請注意,它涉及不同組件中的方法。到目前爲止,我已經嘗試了3種不同的方法,但它們都不是我正在尋找的東西:如何使用cfscript動態調用不同組件的方法?

所有的情況都是用cfscript在組件方法中寫的。假設我試圖動態調用MyComponent組件中的setName(required string name)方法。所有病例有如下的變量定義:

var myComp = new MyComponent(); 
var myMethod = "setName"; 
var args = {"name"="foo"}; 
  • 使用evaluate()作業

    evaluate("myComp.#myMethod#(argumentCollection=args)"); 
    

    利弊:是用很少的代碼完成
    利弊:代碼不是很'乾淨「以及評估()的使用似乎在網絡社區中具有」惡意「的聲譽。我不希望我的代碼是邪惡的。

  • 使用CFML包裝器<cfinvoke>

    invoke("MyComponent", myMethod, args); 
    

    利弊:我可以使用的cfinvoke
    利弊所有功能:它創建的MyComponent新實例每調用。

  • 在MyComponent的

    爲MyComponent的
    myComp.dynamicMethod(myMethod, args); 
    

    DynamicMethod的創建dynamicMethod方法:

    public any function dynamicMethod(required string methodName, required struct argumentColl){ 
        var cfcMethod = variables[arguments.methodName]; 
        return cfcMethod(argumentCollection=arguments.argumentColl); 
    } 
    

    利弊:我終於可以直接調用myComp。目前爲止最舒服的解決方案
    缺點:我現在可以通過dynamicMethod調用MyComponent的私有方法。 (我也嘗試過在MyComponent之外的'function as variable'解決方案,但是這個函數放棄了它的工作上下文,例如,如果MyComponent會擴展一個組件,'超級'範圍將不再引用擴展組件) 。

這些解決方案似乎都不是完美的,那麼沒有其他方法可以從其他控制器調用動態函數嗎?
如果沒有,哪一個是最好的解決方案?

歡迎任何建議,謝謝。

+2

不要回避,因爲人們聲稱它是「邪惡的」。有理由避免評估,你應該知道他們是什麼,而不是相信不合格的不合格要求。 –

+0

爲什麼不能將組件實例而不是它的名稱傳遞給「invoke()」,這樣每次都會重複使用相同的實例 – niahoo

回答

7

良好的分析。

你可以在這裏做的一件事是用你的包裝函數更接近地模擬<cfinvoke><cfinvoke>將採用組件路徑中的一個組件實例(即:一個對象),該屬性爲COMPONENT。所以,你''con''它創建一個MyComponent的新實例,每次調用。'並不是真的有效。

ColdFusion 10,btw,增加了一個invoke()函數來實現這一點。我注意到你在CF9上,所以這對你沒有任何幫助。但是對於可能在這個問題上出現的其他人也許是相關的。

+1

謝謝。我不知道「」的組件參數可能是一個實例。另外cf10功能看起來很有前途。沒有更多的包裝:) – jan