ColdFusion9 UDF嵌套调用

时间:2016-07-01 17:54:03

标签: coldfusion coldfusion-9

我有一个在CF9中创建的cfm文件。除了<cfinvoke>method之外,它有7个returnvariable个语句都相同。有没有办法把它放到一个函数或循环中,这会缩短我的代码并仍然可以工作?

示例:

<cfsilent>
<cfinvoke component="financial.financial" method="getExecSummary" returnvariable="qExecSummary">
    <cfinvokeargument name="level" value="#URL.level#" />
    <cfinvokeargument name="stateGM" value="#URL.stateGM#" />
</cfinvoke>
<!---Added this to test if I can get more than one sheet to the Workbook--->
<cfinvoke component="financial.financial" method="getExecSummary331" returnvariable="qExecSummary331">
    <cfinvokeargument name="level" value="#URL.level#" />
    <cfinvokeargument name="stateGM" value="#URL.stateGM#" />
</cfinvoke>
</cfsilent>

这不起作用:

<cffunction name="getSummary" output=true>
    <cfargument name="method" required="true">
    <cfargument name="returnvariable" required="true">
    <cfargument name="level" required="true">
    <cfargument name="stateGM" required="true">

    <cfinvoke component="financial.financial" method="#method#" returnvariable="#returnvariable#">
        <cfinvokeargument name="level" value="#level#" />
        <cfinvokeargument name="stateGM" value="#stateGM#" />
    </cfinvoke>

    <cfreturn #returnvariable#> 
</cffunction>


<cfset getSummary("getExecSummary","qExecSummary","#URL.level#","#URL.stateGM#")>

如果有人能指出我正确的方向?如果这是可能的话。我一直在努力寻找有关这方面的信息,但我还没有看到任何信息。

我已阅读thisthis寻求帮助。我也发现了几篇没有帮助的帖子。

1 个答案:

答案 0 :(得分:4)

使用createObject("component")cfinvoke更简单。只需创建组件的实例即可。然后调用正确的方法并将结果捕获到所需的变量中:

<!--- separated calls for readability -->
<cfset comp = createObject("component", "path.to.YourComponent")>
<cfset result = comp.firstMethod( "value1", "value2")>

IF 这些方法都是无状态的(并且适当的范围)你可以简单地为所有方法调用重用相同的实例:

<cfset comp = createObject("component", "path.to.YourComponent")>
<cfset result1 = comp.firstMethod( "value1", "value2" )>
<cfset result2 = comp.secondMethod( "value1", "value2" )>
<cfset result3 = comp.thirdMethod( "value1", "value2" )>

另外,正如John Wish mentioned in the comments

  

在CF9 +中,如果您愿意,也可以使用new运算符:

<cfset comp = new path.to.YourComponent()>
     

值得注意的是new运算符也会尝试调用   如果你有一个CFC中的init方法 - 虽然它不需要一个   工作,除了它的工作原理与:

 createObject("component", "path.to.YourComponent")