2012-08-10 31 views
0

作为函数的输入,我得到一个字符串范围名称,如FORMCOOKIE。 如何使用括号表示法访问这些顶级示波器?如何使用括号表示法访问示波器?

我在寻找类似:

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

显然,虽然:)

(我不是在寻找任何一种eval功能不工作,我宁愿switch通过串手动获得比eval功能的权利范围...)

编辑

功能是必需的,所以我可以在请求中尽早调用一个简单/可访问的函数,以识别发送错误类型数据或仅发送所需数据的错误请求。

例如,我会尽可能早地调用下面的函数在需要的变量FORM.data1:numericFORM.data2:bitCOOKIE.data3:string的请求:

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

我知道,下面可能是一个有点容易:

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

,并不仅仅是使用isDefined但我需要其他功能的一些更大的灵活性。

+2

你不”吨。范围已经是全球性的。 **为什么你要这样做?**(可能有更好的方法。) – 2012-08-10 13:27:36

+0

使用Evaluate()。这种事情就是它的存在,除非这个代码处于特别紧密的循环中,否则不会有性能问题。如果可能受到用户输入的影响,您将需要注意对输入进行消毒。 – barnyr 2012-08-10 13:31:10

+1

通过搜索所有范围似乎打败了变量范围开始的目的。 – Busches 2012-08-10 13:31:41

回答

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,'.') />

+0

你说得对,这看起来更干净,特别像最后一个例子的简单。 – 2012-08-10 14:32:55

+0

彼得,运行底部示例需要什么?我似乎无法在CF9中使用它。谢谢。 – Travis 2012-08-13 12:38:17

+0

_“我似乎无法让它工作”_ - 和...?当你尝试时会发生什么?它是否提供了错误信息,或仅仅是意想不到的结果? – 2012-08-13 13:45:39

1

如果不使用Evaluate函数,我不相信这是可能的。可以这么说,范围在链条的顶层,所以在它们之前没有点符号。

5

您可以使用structGet()。在structGet

var theformscope = structGet('form'); 

更多信息是在ColdFusion文档可供选择:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f03.html

+0

这个答案是正确的,但我仍然认为传递一个范围名称的字符串不太可能是正确的解决方案,无论在这里做什么。 – 2012-08-10 13:45:01

+0

你可能是对的,但没有太多的信息可以处理,所以我只是回答了被问到的问题。我只使用过这种技术一次,它是为抽象出一个范围的对象。范围可以是任何的,所以在ColdSpring中作为字符串发送范围名称然后使用structGet()来获取它的句柄实际上是有益的。 – 2012-08-10 13:47:30

+0

是的,那个评论更多的是针对未来可能会出现的人,并且只是在没有思考的情况下使用这个功能。一般来说,传递范围本身而不是(或者)名称是更好的主意。 – 2012-08-10 14:01:16