以编程方式 Select 组合框值

Programmatically Select Combobox Value

我在 xPage 上有一个组合框,它是通过 JavaScript 文件填充的。

此 xPage 也有一个调用 LotusScript 代理的 postNewDocument 事件,该代理从内存文档中预填充 xPage 上的大部分字段,它适用于除此类字段之外的所有字段,因为在为该字段调用 JavaScript 文件之前不会填充组合框。

我认为 select 内存文档中的组合框条目最有效的方法是将文档中的值放入文本字​​段,然后从该字段读取它。以下是组合框的值字段中的内容:

var rArray = getItemOptions();
var prevCountry = getComponent("Org_Country").getValue();
var opt;
if ((prevCountry != "") && (prevCountry != null)){
  for (var i=0; i < rArray.length; i++) {
    rArray[i];
    opt = rArray[i];                    
    if (opt.contains(prevCountry)) {        
        rArray.selectedIndex = i;
    }
  }
}
return rArray;

下面是一些源代码:

<option value="1">Afghanistan</option>
<option value="2">Albania</option>
<option value="3">Algeria</option>
<option value="4">American Samoa</option>

我认为我需要做的是设置 selected="selected" 但 rArray 中没有 "options"。我尝试了其他变体,例如 rArray[i].selected = true 和 rArray[i].selected = "selected" 它们不会产生错误,但只会产生整个组合框。

我想要之前 selected 的组合框项目 selected,但将其保留在组合框中的相同位置并允许用户更改他们的 selection。

这是我的组合框的标记:

<xp:comboBox id="Country" value="#{document1.Country}" styleClass="form-control">
   <xp:selectItems>
       <xp:this.value><![CDATA[#{javascript:return getItemOptions();}]]> </xp:this.value>
   </xp:selectItems>
    <xp:eventHandler event="onchange" submit="true" refreshMode="partial"
    disableValidators="true"
    refreshId="Province">
    <xp:this.action><![CDATA[#{javascript:var selected = getComponent("Country").value;
viewScope.put("countrySelected", selected);}]]></xp:this.action>
    <xp:this.onComplete><![CDATA[$("form").formValidation("addField", "#{id:Province}");
]]></xp:this.onComplete>
    </xp:eventHandler>
</xp:comboBox>

我现在开始着手将此代码放入 onClientLoad 事件中,但我还没有让它工作。

这些国家/地区的数字来自我从别处获得的数据库,但我可以更改它们。

(我在这个答案中做了一些假设 - 即当您说您正在使用 javascript 时,您的意思是 SSJS,因为您在组合框值中调用 getItemOptions 的方式)。

xp:comboBox 有一个 'defaultValue' 属性,您可以通过编程方式设置它。 XPage 控件可能看起来像这样:

<xp:comboBox id="comboBox1" value="#{document1.Country}"
    defaultValue="#{viewScope.defaultValue}">
    <xp:selectItems>
        <xp:this.value><![CDATA[#{javascript:return getItemOptions()}]]></xp:this.value>
    </xp:selectItems>
</xp:comboBox>

(此示例使用 SSJS 将默认值加载到名为 'defaultValue' 的 viewScope 变量中,这可以在生命周期中的任何事件中完成,包括 beforeRenderResponse - 例如 postNewDocument)。

如果您想将字段中的值读入默认值,您可以这样做:

<xp:this.defaultValue><![CDATA[#{javascript:getComponent("Org_Country").getValue()}]]></xp:this.defaultValue>

但是具有默认值的字段应该出现在 comboBox 之前,以便它首先呈现并为 comboBox 提供它的值。

请记住,所选值应包含 "value" 而不是 "label" - 因此在您的国家/地区示例中,如果您希望显示 'Algeria',则应输入“3”。 (但我同意@stwissel 的评论,即最好对国家/地区使用 ISO 代码而不是数字并将 ISO 代码保存到文档中。)

另请注意,您尝试使用 rArray 代码设置的 SelectedIndex 属性 实际上是控件的 属性 而不是值。使用常规的 CSJS,你会使用类似

 document.getElementById("mySelect").selectedIndex = 2

其中 'mySelect' 是组合框的 ID,'selectedIndex' 是选项在值列表中的数字位置(0 是第一个选项)。

顺便说一句,我会注意到使用 LotusScript 代理来 pre-populate XPage 的新文档上的值似乎是一种非常 Lotus Notes 的做事方式,并且可能会使您自己的事情复杂化。我建议看看如何使用 Java Beans,它可以完成完全相同的工作,而且可以轻松地让您输入默认值或 pre-selected 值,而无需不必要地写入字段。

我知道怎么做了。因为我没有这个值,所以我只是 运行 填充组合框的函数的修改版本,返回值作为我的默认值,一切都很好。我想多了。

我会按照@stwissel 的建议使用ISO 代码。