0

FORM関数の入力として、またはのような文字列スコープ名を取得しますCOOKIE。ブラケット表記でこれらのトップレベルのスコープにアクセスするにはどうすればよいですか?

私は次のようなものを探しています:

var myScope = "FORM";
global[myScope];

明らかにそれはうまくいきません:)

(私はどんな種類のeval関数も探していません。関数switchよりも適切なスコープを取得するために手動で文字列を調べたいevalです...)

編集

リクエストの早い段階で簡単にアクセスできる関数を呼び出して、間違った種類のデータを送信している、または必要なデータを送信していない悪いリクエストを特定できるようにするために、機能が必要です。

FORM.data1:numericたとえば、変数、FORM.data2:bitおよびを必要とするリクエストでは、できるだけ早く次の関数を呼び出しますCOOKIE.data3:string

<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>

次のほうが少し簡単だったかもしれないことは承知しています。

<cfset require({
  "FORM.data1":"numeric",
  "FORM.data2":"bit",
  "COOKIE.data3":"string"
})>

使用するだけでisDefinedなく、他の機能のためにもう少し柔軟性が必要です。

4

3 に答える 3

5

これに使えますstructGet()

var theformscope = structGet('form');

structGet の詳細については、ColdFusion のドキュメントを参照してください: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f03.html

于 2012-08-10T13:36:31.623 に答える
1

まあ、最も簡単な解決策は、次のように書くことです。

<cfparam name="form.data1"   type="numeric" />
<cfparam name="form.data2"   type="numeric" />
<cfparam name="cookie.data3" type="string" />


ただし、冗長すぎる場合は、次のように既存のデータ構造を使用できます。

<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>


<cffunction name="require" returntype="void" output=false >
    <cfargument name="Scopes" type="Struct" required />

    <cfloop item="local.CurScope" collection=#Arguments.Scopes#>
        <cfloop item="local.CurVar" collection=#Arguments.Scopes[CurScope]#>
            <cfparam name="#CurScope#.#CurVar#" type="#Arguments.Scopes[CurScope][CurVar]#" />
        </cfloop>
    </cfloop>
</cffunction>


または、それよりもさらに簡単な方法があります。

<cfset require
    ( "FORM.data1"   : "numeric"
    , "FORM.data2"   : "bit"
    , "COOKIE.data3" : "string"
    )>

<cffunction name="require" returntype="void" output=false >

    <cfloop item="local.ArgName" collection=#Arguments#>
        <cfparam name="#ArgName#" type="#Arguments[ArgName]#" />
    </cfloop>

</cffunction>

他の機能にはスコープ外の名前が必要であることを暗示しています。その場合は、単に行うだけです<cfset UnscopedName = ListRest(ArgName,'.') />

于 2012-08-10T14:24:07.980 に答える
1

関数を使わないとできないと思いEvaluateます。スコープはいわば連鎖の最上位にあるので、その先にドット表記はありません。

于 2012-08-10T13:27:12.807 に答える