gpt4 book ai didi

coldfusion - 如何使用 cfc 对象的引用从另一个函数调用函数?

转载 作者:行者123 更新时间:2023-12-04 20:40:26 26 4
gpt4 key购买 nike

对问题短语感到抱歉。我找不到更好的方式来描述它。但我的问题如下:
我有 3 个 cfc,即 settings.cfc、prices.cfc 和 helpers.cfc。这些 cfc 扩展了第 4 个 cfc controller.cfc。
helper.cfc 如下:

<cfcomponent extends="Controller">
<cffunction name="formatCurrency">
<cfset formattedCurrency = 1 />
<cfreturn formattedCurrency>
</cffunction>
<cffunction name="processTemplateVariables">
<cfargument name="templateText" default="defaultText" >
<cfset formatCurrency() />
<cfreturn formattedCurrency >
</cffunction>
</cfcomponent>

settings.cfc 有一个 setApplicationVariables 我们用来设置应用程序级别变量的方法。在这个 cfc 中,我创建了一个 helpers.cfc 对象并将该对象放入应用程序范围。 settings.cfc 如下:
<cfcomponent extends="Controller">
<cffunction name="setApplicationVariables">
<cfset application.helpers = createObject("component","controllers.Helpers") />
</cffunction>
</cfcomponent>

settings.cfc 在应用程序启动时被调用,它反过来创建一个 helpers.cfc 对象并将其放入应用程序范围。
我们在 controller.cfc 中创建对 ProcessTemplateVariables 方法的引用,如下所示:
<cfcomponent extends="Wheels">
<cfset getFormattedCurrency = application.helpers.processTemplateVariables >
</cfcomponent>

在prices.cfc 中,我们使用这个引用来调用 function processTemplateVariables ,它确实如此。但它 does not call the function formatCurrency从 processTemplateVariables 内部调用它并抛出错误“ 变量 formatCurrency 未定义 ”。
但如果我使用 application.helpers.processTemplateVariables(templateText="someText") , 有用。
当我使用 cfinvoke 时,它​​也有效:
<cfinvoke method="processTemplateVariables" component="controllers.helpers" templateText="someText" returnvariable="content">

price.cfc 如下:
<cfcomponent extends="Controller">
<cffunction name="index">
<!--- does not work, throws 'the formatCurrency() variable is undefined' --->
<cfdump var="#getFormattedCurrency("someText")#"><cfabort>
<!--- works --->
<cfinvoke method="processTemplateVariables" component="controllers.helpers" templateText="someText" returnvariable="content">
<!--- works --->
<cfset application.helpers.processTemplateVariables("someText") />
</cffunction>
</cfcomponent>

我不确定为什么使用引用不起作用。
对之前的困惑感到抱歉,但您的评论让我深入挖掘,我发现它是罪魁祸首的引用。有什么办法可以引用这个工作,那会很酷吗?

最佳答案

更新:

This blog entry (by Adam Cameron)有更好的描述。总结一下:

.. it pulls the method out of the CFC, so it will be running in the context of the calling code, not the CFC instance. Depending on the code in the method, this might or might not matter.



在您的具体情况下,这很重要。该函数依赖于 formatCurrency ,它在调用页面的“上下文”中不存在,这就是您收到“未定义”错误的原因。

(来自评论)

是的,我很确定你不能那样做。每个函数都被编译成一个单独的类: specifically a static inner class . (如果将函数名不带括号,即 #application.helpers.formatCurrency# 转储出来,您可以看到内部类名)换句话说,它与任何特定实例断开连接 - 并且通过扩展 - 其他函数。

当您创建组件的实例时,所有函数都存储在其 variables 中。范围。因此,当您从实例中调用“processTemplateVariables”时,它可以通过组件的 variables 访问其他功能。范围。当您的代码创建对该函数的引用时,您实际获得的内容与父实例完全断开,即 application.helpers .因此,它无法访问任何其他功能。因此,为什么您会收到“未定义”错误。

关于coldfusion - 如何使用 cfc 对象的引用从另一个函数调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com