cffunction:基于第一个参数的第二个参数

问题描述:

我有下面的代码首先创建一个对象,然后调用一个名为init的函数。cffunction:基于第一个参数的第二个参数

<cfset SESSION.objWatchlist = createObject("component", "path") /> 
<cfset SESSION.objWatchlist.init(session.addressid) /> 

到目前为止这么好。 init函数如下所示:

<cffunction name="init" access="remote" output="false"> 
    <cfargument name="addressID" type="numeric" required="true" /> 
    <cfset THIS.ADDRESSID = arguments.addressID /> 
    <cfset THIS.WATCHLIST = arrayNew(1) /> 
    <cfset initWatchlistArray() /> 
    <cfreturn this /> 
</cffunction> 

现在我想向cffunction添加另一个参数。我会这样称呼它:

<cffunction name="init" access="remote" output="false"> 
    <cfargument name="typeOfID" type="string" required="true" /> 
    <cfif arguments.typeOfID eq "addressid"> 
    <cfargument name="addressID" type="numeric" required="true" /> 
    <cfset THIS.ADDRESSID = arguments.addressID /> 
    <cfelseif arguments.typeOfID eq "sessionid"> 
    <cfargument name="sessionID" type="string" required="true" /> 
    <cfset THIS.SESSIONID = arguments.sessionID /> 
    </cfif> 
    <cfset THIS.WATCHLIST = arrayNew(1) /> 
    <cfset initWatchlistArray() /> 
    <cfreturn this /> 
</cffunction> 

但每次我得到错误“的标签必须嵌套:

<cfset SESSION.objWatchlist.init("addressid", session.addressid) /> 

<cfset SESSION.objWatchlist.init("sessionid", session.sessionid) /> 

我在cffunction添加一些新线在CFFUNCTION标签内“。

现在我的问题是如何编写一个函数,其中第二个参数是基于第一个参数?

这甚至可能吗?

谢谢。

+0

如果你要在'this'范围内有变量,在一个函数之外声明它们。你可以在一个函数内给它们赋值。关于实际问题,声明所有参数并将函数中的任何逻辑传递给稍后。 –

+0

@DanBracuk:谢谢你的回答。你有这样的例子吗? – Wacki

+0

有点偏离主题。这种类型的代码应该在''中。阅读起来会更容易。 –

最后我找到了一个解决方案,它看起来像这样:

首先,我调用该函数:

<cfset SESSION.objWatchlist.init(addressID=session.addressid) /> 
<cfset SESSION.objWatchlist.init(sessionID=session.sessionid) /> 

我改变了功能如下:

<cffunction name="init" access="remote" output="false"> 
    <cfargument name="addressID" type="numeric" required="false" />  
    <cfargument name="sessionID" type="string" required="false" /> 
    <cfif isDefined("arguments.addressid")> 
    <cfset THIS.ADDRESSID = arguments.addressID /> 
    <cfelseif isDefined("arguments.sessionid")> 
    <cfset THIS.SESSIONID = arguments.sessionid /> 
    </cfif> 
    <cfset THIS.WATCHLIST = arrayNew(1) /> 
    <cfset initWatchlistArray() /> 
    <cfreturn this /> 
</cffunction> 

当调用函数我可以用cffunction中的参数名称来调用它们。 然后我可以检查哪一个是定义的。

+0

只是为了增加一个清晰度(我希望)的变化。你最初的问题是,cfarguments只能在函数的顶部声明。它们不能嵌套在条件内。来自Adobe文档cfargument:“此标签必须位于cffunction标签中,位于cffunction标签正文中的任何其他标签之前。”这就是为什么你收到你所犯的错误。 我会指出,这个新代码可以同时接受addressID和sessionID参数,如果发生这种情况,sessionID不会被设置,因为只有在arguments.addressID没有被传递时才设置它。 –

这是一个注释太长,但我对这个

SESSION.objWatchlist.init(addressID=session.addressid); 
SESSION.objWatchlist.init(sessionID=session.sessionid); 


any function init(numeric addressID, string sessionid) access="remote" output="false" { 

    if (arguments.keyexists(("addressid")) { THIS.ADDRESSID = arguments.addressID; } 
    else if (arguments.keyexists("sessionid") { THIS.SESSIONID = arguments.sessionid; } 

    THIS.WATCHLIST = []; 
    initWatchlistArray(); 
    return this; 
} 

注意一些清理:使用.keyexists()。这是一个更快的检查,因为它不必查看每个可能有匹配项的范围。

另请注意,更容易清空数组。