1

我正在调用 cfc,cfc 有一组默认参数,如下所示:

<cfargument name="EMAIL_TEMPLATE_CODE" type="string" required="yes" hint="EMAIL_TEMPLATE_CODE is required.">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string" required="no" hint="EMAIL_TEMPLATE_SUBJECT is NOT required.">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string" required="no" hint="EMAIL_TEMPLATE_BODY is NOT required.">

我想做的是使这些参数不再是必需的(如您所见,required="no"),但如果需要,我想重新分配参数变量。

所以像:

<cfargument name="EMAIL_TEMPLATE_CODE" type="string" required="yes" hint="EMAIL_TEMPLATE_CODE is required.">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string" required="no" hint="EMAIL_TEMPLATE_SUBJECT is NOT required.">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string" required="no" hint="EMAIL_TEMPLATE_BODY is NOT required.">

<cfinvoke component="#Request.CFCPath#.email_template" method="getEmailTemplate" returnvariable="getEmailTemplate">
    <cfinvokeargument name="EMAIL_TEMPLATE_CODE" value="#ARGUMENTS.EMAIL_TEMPLATE_CODE#">
</cfinvoke>

<cfif getEmailTemplate.RecordCount>
    <cfparam name="ARGUMENTS.EMAIL_TEMPLATE_SUBJECT" default="#getEmailTemplate.EMAIL_TEMPLATE_SUBJECT#" type="string">
    <cfparam name="ARGUMENTS.EMAIL_TEMPLATE_BODY" default="#getEmailTemplate.EMAIL_TEMPLATE_BODY#" type="string">
</cfif>

但我无法覆盖默认的 ARGUMENTS 变量。你有什么可以发现我做错了吗?

编辑:

我这样做是因为如果没有参数传递给 cfc,我想创建一个。我想如果参数没有长度,我应该 cfset 一个局部变量?

<cfif Len(ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM)>
    <cfset EMailTemplateAddressFrom = ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM>
<cfelse>
    <cfset EMailTemplateAddressFrom = getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM>         
</cfif> 

<cfparam>仅当变量之前未定义时才有效。您的函数参数不是未定义的,它们只是碰巧有它们的默认值。所以你可以这样做:

<cffunction name="foo">
  <cfargument name="arg" type="string" required="yes">
  <cfargument name="opt" default="default" type="string" required="no">

  <cfif arguments.opt eq "default">
    <cfset arguments.opt = "whatever dynamic value">
  </cfif>
</cffunction>

这样,如果您不提供“opt”(或故意将其设置为“default”),它将被分配某种动态默认值。如果需要,您仍然可以将其设为空。

除了“默认”之外,您还可以选择其他一些不太可能的值,以便区分“未提供”和“空”。(有时我希望 ColdFusion 支持实际的空值......)

4

2 回答 2

5

<cfparam>仅当变量之前未定义时才有效。您的函数参数不是未定义的,它们只是碰巧有它们的默认值。所以你可以这样做:

<cffunction name="foo">
  <cfargument name="arg" type="string" required="yes">
  <cfargument name="opt" default="default" type="string" required="no">

  <cfif arguments.opt eq "default">
    <cfset arguments.opt = "whatever dynamic value">
  </cfif>
</cffunction>

这样,如果您不提供“opt”(或故意将其设置为“default”),它将被分配某种动态默认值。如果需要,您仍然可以将其设为空。

除了“默认”之外,您还可以选择其他一些不太可能的值,以便区分“未提供”和“空”。(有时我希望 ColdFusion 支持实际的空值......)

于 2009-08-11T17:20:14.390 回答
2
<cfargument name="EMAIL_TEMPLATE_CODE" type="string" 
    default="#getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM#">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string">

或者....

<cfargument name="EMAIL_TEMPLATE_CODE" type="string">
<cfargument name="EMAIL_TEMPLATE_SUBJECT" default="" type="string">
<cfargument name="EMAIL_TEMPLATE_BODY" default="" type="string">
<cfif NOT isDefined("arguments.EMAIL_TEMPLATE_CODE")>
    <cfset arguments.EMAIL_TEMPLATE_CODE = getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM>
</cfif>

仅供参考,required="no"默认情况下,所以我通常不会将它指定给已经很冗长的 CFML。:)

于 2009-08-11T18:43:06.813 回答