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标签内“。
现在我的问题是如何编写一个函数,其中第二个参数是基于第一个参数?
这甚至可能吗?
谢谢。
最后我找到了一个解决方案,它看起来像这样:
首先,我调用该函数:
<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中的参数名称来调用它们。 然后我可以检查哪一个是定义的。
只是为了增加一个清晰度(我希望)的变化。你最初的问题是,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()
。这是一个更快的检查,因为它不必查看每个可能有匹配项的范围。
另请注意,更容易清空数组。
如果你要在'this'范围内有变量,在一个函数之外声明它们。你可以在一个函数内给它们赋值。关于实际问题,声明所有参数并将函数中的任何逻辑传递给稍后。 –
@DanBracuk:谢谢你的回答。你有这样的例子吗? – Wacki
有点偏离主题。这种类型的代码应该在''中。阅读起来会更容易。 –