2012-08-10 47 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