【问题标题】:Programmatically Select Combobox Value以编程方式选择组合框值
【发布时间】:2018-03-15 19:11:06
【问题描述】:

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

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

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

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 中没有“选项”。我尝试了其他变体,例如 rArray[i].selected = true 和 rArray[i].selected = "selected",它们不会产生错误,而只会产生整个组合框。

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

这是我的组合框的标记:

<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 事件中,但我还没有让它工作。

这些国家/地区的数字来自我在其他地方获得的数据库,但我可以更改它们。

【问题讨论】:

  • 组合框的标记是什么样的? xp 一个。通常您只需将值绑定到支持文档。一个技巧:使用文档服务器端的一个值预先填充下拉列表。附带说明:不要使用国家/地区的数字。使用 iso 代码
  • 我已经添加了上面的标记。

标签: javascript arrays combobox xpages xpages-ssjs


【解决方案1】:

(我在这个答案中做了一些假设——也就是说,当你说你正在使用 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>

但具有默认值的字段应位于组合框之前,以便它首先呈现并赋予组合框它的值。

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

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

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

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

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

【讨论】:

  • 非常感谢你们俩。我的问题是文档上 Country 字段中唯一的内容是国家名称。没有值/标签。所以我需要执行查找。而且我不能用 SSJS 做到这一点,我似乎也不能在 xPage 的 onClientLoad 事件上使用 CSJS 做到这一点,我相信因为组合框尚未填充。你会建议用什么方法来做到这一点?
【解决方案2】:

我想出了如何做到这一点。因为我没有该值,所以我只运行了填充组合框的函数的修改版本,将值作为我的默认值返回,一切都很好。这个我想多了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多