【问题标题】:ColdFusion - Converting a query into CFC settersColdFusion - 将查询转换为 CFC 设置器
【发布时间】:2012-12-15 23:39:04
【问题描述】:

我正在将一个旧网站转换为 CF 10,并希望提供一些我的帮助代码。

代码查看查询,找到我们实例中的内容并填充它们:

<cffunction name="populateSelf">
    <cfargument name="source" type="query" required="yes" />
    <cfif arguments.source.recordcount EQ 1>
        <cfloop list="#arguments.source.columnlist#" index="local.col">
            <cfif structKeyExists(variables.instance, local.col)>
                <cfset variables.instance[local.col] = arguments.source[local.col]) />
            </cfif>
        </cfloop>
    </cfif> <!--- one record? --->
</cffunction>

我已将 structKeyExists(variables.instance, local.col) 替换为使用 'getMetaData()' 对我们当前属性的方便评估,但我在下一行遇到问题:&lt;cfset variables.instance[local.col] = arguments.source[local.col]) /&gt;

如果我将其更改为&lt;cfset this[local.col] =arguments.source[local.col] /&gt;,它会忽略隐式设置器,只是将结果放在 this 范围内...

为了尝试调用我们的设置器,我尝试了这段代码:

<cfset setValue =arguments.source[local.col] />
<cfset evaluate("set#local.col#('#setValue#')" />

但这似乎很复杂且容易出错(也必须转义字符串中的任何“'”)。

使用查询加载部分或全部 CFC 属性而无需显式调用 this.setPROPERTYNAME(query.COLUMN) 可能数十次的最佳方式是什么????

【问题讨论】:

    标签: coldfusion coldfusion-10


    【解决方案1】:

    如果你想动态调用方法,你可以使用 cfinvoke

    <cfinvoke method="set#property#">
    

    有意义吗?

    【讨论】:

    • 其实不错的电话。用函数引用省去麻烦。
    • 好的,我试过 但我无法让它接受要设置的参数,因为我不知道该参数的名称。 (我试过 没有运气)...
    • 啊,我明白你的问题了。您是否没有为您的 setter 设置参数名称的命名约定,就像您为您的方法本身制定命名约定一样?如果你这样做了,那么除了我之前提到的内容之外,你还可以使用 cfinvokeargument。
    • 你不能简单地使用argumentcollection吗?还是我错过了什么(cc @baynezy)
    • @AdamCameron 您也可以使用 argumentCollection。他的问题是他不知道要传递给方法的参数的名称。所以你的方式他只是摆脱了参数顺序。
    【解决方案2】:

    所以如果我没看错的话,你的问题实际上是“我如何动态调用一个方法?”,剩下的都是套路?

    你可以使用一个字符串来设置动态变量名,然后设置一个函数引用,然后通过引用调用函数:

    myMethodName = "set#local.col#";
    myMethodReference = this[myMethodName];
    myMethodReference(arguments.source[local.col]);
    

    【讨论】:

    • 是的! “如何动态调用方法!”我想不出正确的动词来使用......愚蠢的假期,我的大脑正在泄漏。
    • 嘿斯蒂芬...@baynezy 的回答比我的好!你应该按照他的建议而不是我的建议运行。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多