对于翻译问题的措辞表示抱歉,我找不到更好的描述方式。但我的问题如下:
我有三个CFC,分别是settings.cfc、prices.cfc和helpers.cfc。这些CFC都扩展了第四个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
,它会被执行。但是它没有调用从processTemplateVariables中调用的函数formatCurrency
,并且会抛出错误"variable formatCurrency is undefined"。但如果我使用
application.helpers.processTemplateVariables(templateText="someText")
,它就可以工作了。当我使用下面的cfinvoke时,它也可以正常工作:
<cfinvoke method="processTemplateVariables" component="controllers.helpers" templateText="someText" returnvariable="content">
prices.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>
我不确定为什么使用引用不起作用。很抱歉之前的混乱,但是你的评论让我深入挖掘,我发现问题出在了引用上。有没有办法通过引用来达到这个效果,那就太棒了。
cfobject
调用中,您正在传递一个参数。如果您在createObject
中传入该参数,错误是否仍然发生? - Matt BuscheformatCurrency()
方法?如果是这样的话,当您创建实例时调用不存在的函数可能会导致您看到的“未定义”错误。如果是这种情况,使用cfinvoke(按“名称”)将起作用,因为它每次都会创建一个新实例,因此它将使用最新的代码。 - Leigh