如何处理 xp:checkBoxGroup 的值

How to handle value of a xp:checkBoxGroup

在我的 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 的值为真(感兴趣 [0] 真)

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

这里有逻辑吗?

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

现在我有

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

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

我该如何处理?

我不太清楚复选框的 return 值可以阅读文档:https://www.openntf.org/xspext/xpages%20extension%20library%20documentation.nsf/xpages-doc/xp_checkBoxGroup.html

为什么不使用普通复选框?这里只有 returns true or false:

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

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

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

既然您知道您正在使用 viewScope - 或与此相关的任何其他范围 - 为什么不使用框架知道如何做到最好的呢?管理豆子!

此时您可以编写可靠的防御性代码,这将始终为您提供帮助:

豆子

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 属性表示的勾选复选框。