我在 XPage 上使用 Dojo Filtering Select 控件,并希望在保存 XPage 时同时保存标签和值。我是否可以将这两个值保存到相同或单独的字段中?
2 回答
我使用 Java bean 来保存此类信息。这将使以后翻译页面变得容易得多。因此,我将各种选项定义为静态地图:
private static final Map<String, String> userInterestLabels;
static {
userInterestLabels = new HashMap<String, String>();
userInterestLabels.put("1", "Environment");
userInterestLabels.put("2", "Sience");
userInterestLabels.put("3", "Regulations");
userInterestLabels.put("4", "Generel interest");
}
然后我有一种方法可以返回该字段的选择项列表:
public List<SelectItem> getListUserInterests() {
List<SelectItem> selectItems = new ArrayList<SelectItem>();
for (Map.Entry<String, String> item : userInterestLabels.entrySet()) {
selectItems.add(new SelectItem(item.getKey(), item.getValue()));
}
return selectItems;
}
在我的 XPage 中,我使用表达式语言(不需要 SSJS)引用此方法:
<xe:djFilteringSelect id="inputRoleInterest" value="#{User.interest}"
disableValidators="true" hasDownArrow="true" immediate="true">
<xp:selectItems>
<xp:this.value><![CDATA[#{User.listUserInterests}]]></xp:this.value>
</xp:selectItems>
现在,当您提交此页面时,User bean 有一个通过绑定#{User.interest} 调用的方法“setInterest()”。在该方法中,您可以根据从该字段返回的值获取标签。我有这样的方法:
public String getUserInterestLabel(String interest) {
String label = userInterestLabels.get(interest);
return (null == label) ? "" : label;
}
它从用于生成您的选择项的同一地图返回标签。现在您可以将该标签保存在另一个字段中 - 或者您想用它做什么;-)
public void setInterest(String interest) {
this.interest = interest;
this.interestLabel = getUserInterestLabel(interest);
}
/约翰
您想将文档的字段设置为当前选定值的相应标签。
下面的代码适用于已定义的项目和基于属性、视图、bean 或其他源的xp:selectItem
各种计算定义。xp:selectItems
服务器端 JavaScript 解决方案
在 onclick 事件中添加以下 SSJS 代码以提交按钮:
<xp:this.action><![CDATA[#{javascript:
var select = getComponent('djFilteringSelect1');
var list = select.getChildren();
var value = select.getValue();
var label = "";
for (var i = 0; i < list.length && label === ""; i++) {
print (i);
if (typeof list[i] === 'com.ibm.xsp.component.UISelectItemEx') {
if (list[i].getItemValue() === value) {
label = list[i].getItemLabel();
}
} else if (typeof list[i] === 'com.ibm.xsp.component.UISelectItemsEx') {
items = list[i].getValue();
for (var k = 0; k < items.length && label === ""; k++) {
if (items[k].getValue() === value) {
label = items[k].getLabel();
}
}
}
}
document1.setValue("label", label)
}]]></xp:this.action>
它遍历所有定义selectItems
的Dojo Filtering Select 控件,查找选定的值并将相应的标签写入文档的字段“label”。
客户端 JavaScript 解决方案
创建一个连接到文档字段“标签”的隐藏输入字段:
<span style="display:none">
<xp:inputText
id="fieldLabel"
value="#{document1.label}">
</xp:inputText>
</span>
在 onclick 事件中添加以下 CSJS 代码以提交按钮:
<xp:this.script><![CDATA[XSP.getElementById("#{id:fieldLabel}").value =
dijit.byId('#{id:djFilteringSelect1}').get('displayedValue')]]>
</xp:this.script>
它将输入字段设置为当前选定值的标签,并从那里写入文档的字段“标签”。