以编程方式选择组合框值

时间:2018-03-15 19:11:06

标签: javascript arrays combobox xpages xpages-ssjs

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

xp:comboBox有一个&#39; defaultValue&#39;您可以通过编程方式设置的属性。 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>

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

如果您想将字段中的值读入默认值,可以使用以下命令:

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

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

请记住,所选值应包含&#34;值&#34;而不是&#34;标签&#34; - 所以在你的国家的例子中,你会把&#39; 3&#39;如果你想要&#39;阿尔及利亚&#39;显示。 (但我同意@ stwissel的评论,最好将国家/地区使用ISO代码代替数字,并将ISO代码保存到文档中。)

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

的内容
 document.getElementById("mySelect").selectedIndex = 2

其中&#39; mySelect&#39;是comboBox的id和&#39; selectedIndex&#39;是值列表中选项的数字位置(0是第一个选项)。

顺便说一下,我会注意到使用LotusScript代理为XPage预先填充新文档的值似乎是Lotus Notes的一种做事方式,并且可能使问题复杂化。我建议看看如何使用Java Beans来完成相同的工作,并且很容易让你输入默认值或预先选择的值,而不需要不必要地写入字段。

答案 1 :(得分:0)

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

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