代码之家  ›  专栏  ›  技术社区  ›  jyoseph

是否可以重新分配cfc中的默认<cfArgument?

  •  1
  • jyoseph  · 技术社区  · 15 年前

    我在调用一个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>
    

    但我不能重写默认参数变量。你能发现我做错了什么吗?

    编辑:

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

    <cfif Len(ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM)>
        <cfset EMailTemplateAddressFrom = ARGUMENTS.EMAIL_TEMPLATE_ADDRESS_FROM>
    <cfelse>
        <cfset EMailTemplateAddressFrom = getEmailTemplate.EMAIL_TEMPLATE_ADDRESS_FROM>         
    </cfif> 
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Tomalak    15 年前

    <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支持实际的空值…)

        2
  •  2
  •   Henry    15 年前
    <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>
    

    FYI required="no" 默认情况下,所以我通常不将其指定为已经详细的cfml。:)