如何处理xp:checkBoxGroup的值

时间:2018-09-20 08:48:16

标签: xpages xpages-ssjs

在Xpage中,我有一个带有1个选项的复选框组:

<xp:checkBoxGroup id="cbSignUp"
    value="#{viewScope.interested}">
    <xp:selectItem itemLabel=""
        itemValue="true" />
    <xp:eventHandler event="onchange"
        submit="true" refreshMode="partial" refreshId="pnlUpdate" />
</xp:checkBoxGroup>

最初未选中该复选框时,viewScope不可用。

当我选中此框时,viewScope的值为true(感兴趣的[0]为true)

当我取消选中该框时,viewScope的值是一个空列表(感兴趣的(空列表))

在这里可以找到逻辑吗?

基于检查器,我要在pnlUpdate面板中显示或隐藏EditBox。

现在我有

if (null == viewScope.get("interested")){
    return false;
} else{
    return true;
}

但是当viewScope包含一个空列表时,这将不起作用。

我该如何处理?

对于我来说,目前还不清楚复选框的返回值可以用来读取文档:https://www.openntf.org/xspext/xpages%20extension%20library%20documentation.nsf/xpages-doc/xp_checkBoxGroup.html

2 个答案:

答案 0 :(得分:1)

为什么不使用普通复选框?在这里,它只会返回true或false:

<xp:checkBox id="checkBox1" value="#{viewScope.aScope}">
                                <xp:eventHandler event="onclick"
                                    submit="true" refreshMode="partial" refreshId="pnlEscHighRisk">
                                </xp:eventHandler></xp:checkBox>

答案 1 :(得分:1)

您期望xp:checkBoxGroup返回一个truefalse(甚至是布尔值:D)值,但事实并非如此。可以勾选多个复选框-因此可能有多个值-您如何期望它们会被表示?在这种情况下,它是一个字符串列表(尽管使用正确的转换器时,它们可以是任何类型的列表)。

依靠(request|view|session|application)Scope并不是一个好习惯,实际上这是一个糟糕的拐杖(让我们再次感谢IBM来向我们展示错误的方式)。它使您对编写的代码不熟悉,最终在这种情况下可能会咬住您。我的意思是,尤其是对于列表或地图,要返回的是一个一致的值,而没有用于空检查的其他代码(最佳做法是您应使用Collections.emptyList()Collections.emptyMap() (如果列表未初始化,或者您不需要延迟加载它),但是,正如我们所说,这是一种强制错误,因为您可以随意抛出viewScope.引用,并认为一切都会好起来的

既然您知道自己正在使用viewScope-或任何其他范围,为什么不使用框架知道的最佳方法呢?正在管理bean!

此时,您可以编写合理的防御性代码,这将始终帮助您解决问题:

豆子

public class MyViewScopedBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<String> sweets;

    public List<String> getSweets() {
        if (sweets == null) {
            sweets = new ArrayList<String>();
        }

        return sweets;
    }

    public void setSweets(List<String> sweets) {
        this.sweets = sweets;
    }

}

xsp

上面的bean被引用为bean

<h3>Select the sweets</h3>

<xp:div id="containerSweetForm">
    <xp:checkBoxGroup id="checkBoxGroup1" value="#{bean.sweets}">
        <xp:selectItem itemLabel="Biscuit" itemValue="biscuit" />
        <xp:selectItem itemLabel="Ice cream" itemValue="icecream" />
        <xp:selectItem itemLabel="Pie" itemValue="pie" />
    </xp:checkBoxGroup>

    <xp:button value="Tell me the sweets" id="button1">
        <xp:eventHandler event="onclick" submit="true"
            execMode="partial" execId="containerSweetForm" refreshMode="partial"
            refreshId="containerSweets" />
    </xp:button>
</xp:div>

<h3>Selected sweets</h3>

<xp:div id="containerSweets">
    <xp:text value="#{bean.sweets}" />
</xp:div>

列表中所有用它们的itemValue属性表示的已选中的复选框。