1

我在 XPage 上使用 Dojo Filtering Select 控件,并希望在保存 XPage 时同时保存标签和值。我是否可以将这两个值保存到相同或单独的字段中?

4

2 回答 2

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);
}

/约翰

于 2013-11-05T09:58:07.100 回答
1

您想将文档的字段设置为当前选定值的相应标签。

下面的代码适用于已定义的项目和基于属性、视图、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>

它将输入字段设置为当前选定值的标签,并从那里写入文档的字段“标签”。

于 2013-10-31T17:30:51.563 回答