2017-10-11 26 views
1

私はオブジェクトを最初に作成した後、initという関数を呼び出します。cffunction:最初の引数に基づく2番目の引数

<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 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タグの内部にあります "。

今私の質問は、2番目の引数が最初のものに基づいている関数を書くことができますか?

これも可能ですか?

ありがとうございます。私はそのように見える解決策を発見した終わりに

+0

もし 'this'スコープに変数がある場合は、それらを関数の外に宣言してください。関数内で値を与えることができます。実際の質問に関しては、すべての引数を宣言し、そのロジックを後で関数に転送します。 –

+0

@ダンブルクック:あなたの答えをありがとう。あなたはそのための例がありますか? – 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> 

を呼び出すとき

まず私は、関数を呼び出しますその関数を関数の引数の名前で呼び出すことができます。 その後、どちらが定義されているか確認できます。

+0

あなたの変更に明快さ(私が願っています)を追加するだけです。元の問題は、関数の先頭でのみcfargumentsを宣言できることでした。それらは条件付きの内部に入れ子にすることはできません。 cfargumentのAdobeドキュメントから: "このタグは、cffunctionタグ本体の他のタグの前に、cffunctionタグ内になければなりません。"それが、あなたがしたエラーを受け取った理由です。 この新しいコードはaddressIDとsessionIDの両方のパラメータを受け入れることができますが、その場合は、arguments.addressIDが渡されない場合にのみ設定されるため、sessionIDは設定されません。 –

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()の使用を。これは、一致するものを持つ可能性があるすべてのスコープを調べる必要がないため、より高速なチェックです。

また、配列を空白にする方が簡単です。

関連する問題