jsf - 摆脱"双击"在复选框(PrimeFaces' selectManyCheckbox)中显示值

时间:2014-12-18 13:16:46

标签: jsf-2 primefaces

表单中有一个复选框,需要双击才能将值传递给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());
}

首先单击(选择选项)显示:

  

选择的:   []

第二次单击(取消选择该选项)显示:

  

选择的:   [平日]

2 个答案:

答案 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);
}