我正在尋找從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會擴展一個組件,'超級'範圍將不再引用擴展組件) 。
這些解決方案似乎都不是完美的,那麼沒有其他方法可以從其他控制器調用動態函數嗎?
如果沒有,哪一個是最好的解決方案?
歡迎任何建議,謝謝。
不要回避,因爲人們聲稱它是「邪惡的」。有理由避免評估,你應該知道他們是什麼,而不是相信不合格的不合格要求。 –
爲什麼不能將組件實例而不是它的名稱傳遞給「invoke()」,這樣每次都會重複使用相同的實例 – niahoo