我一直在使用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>
答案 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 = {}