0

作为函数的输入,我得到一个字符串范围名称,例如FORMor COOKIE。如何以括号表示法访问这些顶级范围?

我正在寻找类似的东西:

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

显然这不起作用:)

(我不是在寻找任何类型的eval函数,我宁愿switch手动通过字符串来获得正确的范围而不是eval函数......)

编辑

需要功能,因此我可以在请求的早期调用一个简单/可访问的函数,以识别错误请求,这些请求要么发送错误类型的数据,要么只是不发送所需数据。

例如,我将在需要变量的请求中尽早调用以下函数FORM.data1:numericFORM.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');

ColdFusion 文档中提供了有关 structGet 的更多信息:http: //help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f03.html

于 2012-08-10T13:36:31.623 回答
1

我不相信不使用这些Evaluate功能是可能的。范围可以说是链的顶层,所以前面没有点符号。

于 2012-08-10T13:27:12.807 回答
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 回答