如何在ColdFusion 8中选择ARGUMENTS?

时间:2012-03-20 15:14:15

标签: coldfusion coldfusion-9 coldfusion-8 coldfusion-10

我一直在使用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中的“selected”参数(或任何其他参数)可选?

<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>

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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]的期望。

P.S。不要忘了,你需要在CF8中创建自己的LOCAL范围......即var LOCAL = {}