3

我一直在定期使用 ColdFusion 8 / 9 / 10。下面的代码在 CF9 和 CF10 中运行良好。(我在 9 中开发了它)。但它在 CF8 中不起作用。

如果你在 CF9 和 CF10 中运行下面的代码(在底部),你应该立即得到下面的 HTML 结果:

<select>
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
    <option selected="" value="3">Option 3</option>
</select>

如果你在 CF8 中运行下面的代码,你会得到这个错误:

The SELECTED parameter to the WrapOption function is required but was not passed in.

在 CF8 中,我将如何修改此代码以使 CF8 中的“选定”参数(或任何其他参数)可选?

<cfscript>

Options = WrapOption("Option 1", 1);
Options = Options & WrapOption("Option 2", 2);
Options = Options & WrapOption("Option 3", 3, "Selected");
SelectBox = WrapSelect(Options);
writeOutput(SelectBox);

// WRAP OPTION
function WrapOption(Content, Value, Selected) {
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (structKeyExists(ARGUMENTS, "Selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
}
// WRAP SELECT
function WrapSelect(Options, Class, ID) {
    LOCAL.Options = ARGUMENTS.Options;
    LOCAL.Properties = "";
    // CLASS
    if (structKeyExists(ARGUMENTS, "Class")) {
        LOCAL.Properties = LOCAL.Properties & " class='#ARGUMENTS.Class#'";
    }
    // ID
    if (structKeyExists(ARGUMENTS, "ID")) {
        LOCAL.Properties = LOCAL.Properties & " id='#ARGUMENTS.ID#'";
    }
    LOCAL.Item = "<select #LOCAL.Properties#>#LOCAL.Options#</select>";
    return LOCAL.Item;
}
</cfscript>
4

2 回答 2

7

在 CFSCRIPT 中,命名参数是必需的,除非提供了默认值(直到 CF9 才能完成)。

要在 ColdFusion 8 及更低版本中的 CFSCRIPT 中执行可选参数,您需要从函数定义中删除参数并检查它是否存在于函数体中。您可以通过利用 ColdFusion 对序数(有序而不是命名)参数的处理来做到这一点。

function WrapOption(Content, Value) {
    if ( ArrayLen(Arguments) GTE 3 ) {
        ARGUMENTS.Selected = ARGUMENTS[3];
    }   
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (structKeyExists(ARGUMENTS, "Selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
}
于 2012-03-20T19:58:16.703 回答
3

肖恩是正确的:

函数所需参数的名称。传递给函数的参数数量必须等于或超过函数定义开头括号中的参数数量。如果调用页面省略了任何必需的参数,ColdFusion 会生成不匹配的参数计数错误。

引自: http: //livedocs.adobe.com/coldfusion/8/htmldocs/UDFs_03.html

我想你可以用 CFML 重写它,然后它肯定会工作。

// WRAP OPTION
<cffunction name="WrapOption" output="false">
  <cfargument name="Content" required="true">
  <cfargument name="Value" required="true">
  <cfargument name="Selected">
  <cfscript>
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (structKeyExists(ARGUMENTS, "Selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
  <cfscript>
</cffunction>

或者作为 CF8 的解决方法,不要在函数声明器中定义选定的值。只需检查是否arguments[3]已定义。确保您在评论中记录了参数 [3] 的预期内容。

ps不要忘记,您需要在CF8中制作自己的LOCAL范围......即var LOCAL = {}

于 2012-03-20T18:14:27.417 回答