在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
答案 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
返回一个true
或false
(甚至是布尔值: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;
}
}
上面的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
属性表示的已选中的复选框。