我正在尝试从已传递到引用另一个对象的对象的字符串构建方法调用。
通常在调用对象时我们会编写如下代码:
application.stObj.oNewsBusiness.getNews(argumentCollection=local.stArgs);
然而,我所做的是创建一个包含对象名称,方法名称和参数集合的数组。
<cfscript>
local.stArgs = {};
local.stArgs.nNewsID = 19;
local.stArgs.sAuthor = "John";
local.aData = [];
local.aData[1] = local.stArgs;
local.aData[2] = "stObj.oNewsBusiness";
local.aData[3] = "getNews";
</cfscript>
然而,我正在努力将所有这些重新组合成一个方法调用。
使用建议更新但仍有问题
虽然cfinvoke似乎适用于:
<cfinvoke component="#application.stObj.oNewsBusiness#" method="#local.sMethod#" argumentcollection="#local.stArgs#" returnvariable="local.qData"></cfinvoke>
在执行以下操作时不起作用:
<cfscript>
local.stArgs = local.aData[1];
local.sObject = local.aData[2];
local.sMethod = local.aData[3];
</cfscript>
<cfinvoke component="application.#local.sObject#" method="#local.sMethod#" argumentCollection="#local.stArgs#" returnvariable="local.qData"></cfinvoke>
它会产生错误:
找不到ColdFusion组件或接口application.stObj.oNewsBusiness
答案 0 :(得分:7)
CFInvoke通常用于处理动态方法调用。
http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7e0a.html
CFInvoke有一个argumentcollection属性,所以你可以按照习惯的方式传递你的参数。
答案 1 :(得分:2)
Dan是正确的CFInvoke是要走的路
<cfinvoke component="#mycomponentname#" method="get" arg1="#arg1#" arg2="#arg2#" arg3=..>
答案 2 :(得分:0)
<cfinvoke component="application.#local.sObject#" method="#local.sMethod#"argumentCollection="#local.stArgs#" returnvariable="local.qData"></cfinvoke>
您的更新中的将无效,因为组件变量周围没有#符号。
你可以做到
<cfset local.componentName = "application." & local.sObject>
<cfinvoke component="#local.componentName#" method="#local.sMethod#"argumentCollection="#local.stArgs#" returnvariable="local.qData"></cfinvoke>
可能有一种结合应用程序的内联方式。使用cfinvoke调用的变量,但我不知道我的头脑。
编辑:Dan Wilson的评论以内联方式做得更好。