1

引数の構造体の内容を、コンポーネントのすべての関数の変数スコープに簡単に配置したいと考えています。「タイトル」は searchitems 構造体の 1 つです。

<cffunction name="setSearch" acces="public" returntype="void">    
     <cfargument name="searchitems" type="struct" required="true" />
     <cfset variables = arguments.searchitems>
     <cfset variables.test = "yo">           
</cffunction>

<cffunction name="testit" acces="public" returntype="void">
    <cfdump var="#variables.test#"><br>
    <cfif isdefined('variables.test')>found in variables.test  </cfif>
    <cfif isdefined('variables.variables.test')>found in variables.variables.test </cfif>
    <hr>
    <cfdump var="#variables.title#"><br>
    <cfif structkeyexists(variables,'title')>found in variables.title with structkeyexists </cfif>
    <cfif structkeyexists(variables.variables,'title')>found in variables.variables.title with structkeyexists</cfif>
    <cfif isdefined('variables.title')>found in variables.title </cfif>
    <cfif isdefined('variables.variables.title')>found in variables.variables.title</cfif>
</cffunction>

ただし、これを実行すると次のようになります。

yo
found in variables.test

mytitletext
found in variables.variables.title with structkeyexists
found in variables.variables.title 

タイトルを変数としてダンプまたは出力できるのは奇妙だと思います.タイトルですが、isDefinedまたはstructkeyexistsで検出できません。より効率的な割り当て方法はありますか

<cfset variables = arguments.searchitems> 
4

2 に答える 2

1

Adam のアドバイスに従いsearchitems、個別の項目としてではなく、変数スコープ内の独自の個別の構造体に保持することをお勧めします。そうすれば、他の変数を上書きするリスクがなくなります。

Test.cfc

<cfcomponent>

    <cffunction name="init">
        <!--- Set up a separate empty container for the searchitems to be available to all functions --->
        <cfset variables.searchitems = StructNew()>
        <cfreturn this>
    </cffunction>

    <cffunction name="setSearch" returntype="void">    
        <cfargument name="searchitems" type="struct" required="true">
        <!--- Fill the container with the struct passed into this function --->
        <cfset variables.searchitems = arguments.searchitems>
    </cffunction>

    <cffunction name="dumpSearchTitle" returntype="void">
        <cfdump var="#variables.searchitems.title#">
    </cffunction>

</cfcomponent>

索引.cfm

<cfscript>
    request.searchitems = StructNew();
    request.searchitems.title = "mytitletext";
    test = CreateObject( "component", "test" );
    test.setSearch( request.searchitems );
    test.dumpSearchTitle();
</cfscript>

ただし、個人を変数スコープに含めることが本当に重要な場合は、searchitemsそれらを変数スコープに追加できます。の 3 番目のfalseパラメーターは、StructAppend既存の変数を上書きしないようにします。

Test.cfc

<cfcomponent>

    <cffunction name="init">
        <cfreturn this>
    </cffunction>

    <cffunction name="setSearch" returntype="void">    
        <cfargument name="searchitems" type="struct" required="true">
        <cfset StructAppend( variables,arguments.searchitems,false )>
    </cffunction>

    <cffunction name="dumpSearchTitle" returntype="void">
        <cfdump var="#variables.title#">
    </cffunction>

</cfcomponent>
于 2013-09-14T08:36:50.357 に答える