如何处理 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
返回 true
或 false
(甚至可能是布尔值 :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
属性表示的勾选复选框。
在我的 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
返回 true
或 false
(甚至可能是布尔值 :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
属性表示的勾选复选框。