表单中有一个复选框,需要双击才能将值传递给bean。我想这是双重提交,但不知道如何摆脱它。
现在代码:
<p:selectManyCheckbox id="displayBy" style="font-size: 12px" value="#{detailedDashboardMB.displayBy}" valueChangeListener="#{detailedDashboardMB.onDisplayByClick}" columns="6" layout="grid">
<f:ajax render=":messages:growl detailed-chart" />
<f:selectItem itemLabel="Weekday" itemValue="Weekday" />
</p:selectManyCheckbox>
事件方法:
public void onDisplayByClick() {
jsfUtils.messages("INFO", "Selected:", this.displayBy.toString());
}
首先单击(选择选项)显示:
选择的: []
第二次单击(取消选择该选项)显示:
选择的: [平日]
答案 0 :(得分:0)
ValueChangeListener无法正常工作,这是一个常见错误,也许是因为它的名字。
Check this answer by BalusC关于valueChangeListener
和<f:ajax>
[...]只有在提交表单并且提交的值与初始值不同时,才会调用valueChangeListener。 [...] 的
所以......因为ValueChangeListener只在提交表单时才起作用,而这不是你想要做的,你可以使用<p:ajax>
更新组件并调用bean中的方法:
<p:selectManyCheckbox id="displayBy" style="font-size: 12px" value="#{detailedDashboardMB.displayBy}" columns="6" layout="grid">
<p:ajax update=":messages:growl detailed-chart" listener="#{detailedDashboardMB.onDisplayByClick()}" />
....
我不确定为什么您的代码需要2次点击才能工作,但请尝试使用<p:ajax>
示例。
答案 1 :(得分:0)
好的我理解你的问题。 valueChangeListener
在更新模型值之前调用,因此displayBy
似乎没有同步。
在正确的代码下面:
public void onDisplayByClick(ValueChangeEvent e) {
log.debug("OLD: " + e.getOldValue()); //is empty at first time
log.debug("NEW: " + e.getNewValue()); // is not anymore at first time
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Checkbox Selected", e.getNewValue().toString());
FacesContext.getCurrentInstance().addMessage(null, message);
}