2017-10-11 209 views
1

我有下面的代碼首先創建一個對象,然後調用一個名爲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

有點偏離主題。這種類型的代碼應該在''中。閱讀起來會更容易。 –

回答

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沒有被傳遞時才設置它。 –

0

這是一個註釋太長,但我對這個

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()。這是一個更快的檢查,因爲它不必查看每個可能有匹配項的範圍。

另請注意,更容易清空數組。

相關問題