XPages - Dojo过滤选择 - 保存标签和值

时间:2013-10-31 14:49:33

标签: xpages xpages-ssjs

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

2 个答案:

答案 0 :(得分: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);
}

/约翰

答案 1 :(得分:1)

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

下面的代码适用于定义的xp:selectItem项和基于属性,视图,bean或其他源的所有类型的计算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>

它遍历所有已定义的Dojo Filtering Select控件的selectItems,查找所选值并将相应的标签写入文档的字段“label”。

客户端JavaScript解决方案

创建一个隐藏的输入字段,该字段连接到文档的字段“label”:

<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>

它将输入字段设置为当前所选值的标签,然后将其写入文档的字段“label”。