jsf selectOneMenu值不会改变

时间:2017-03-30 08:06:39

标签: jsf triggers

我有一个selectOneMenu,它具有正确的值(字符串列表)但是当我选择一个值时,它不会触发bean的setSelectedValue。

<h:selectOneMenu layout="lineDirection" id="myMenu" value="#{dwrBean.selectedValue}"> 
    <f:selectItems value="#{Bean.values}"/> 
</h:selectOneMenu>

豆:

private String selectedValue = "";
private List<String> values = new LinkedList<String>();

...

public String getSelectedValue() {
    return this.selectedValue;
}

public void setSelectedValue(String selectedValue) {
    LOGGER.debug("Try to set selected value" + selectedValue);
    if (!selectedValue.isEmpty()){
        this.selectedValue = selectedValue ;
    }
}

日志中没有任何内容。

我试图添加一个监听器:

<h:selectOneMenu layout="lineDirection" id="myMenu" value="#{dwrBean.selectedValue}" valueChangeListener="#{dwrBean.statusChanged}" > 
    <f:selectItems value="#{dwrBean.values}"/> 
</h:selectOneMenu>

这里触发了statusChanged,但newValue为null,oldValue是正确的,但它始终是相同的。

public void statusChanged(ValueChangeEvent event) {
    LOGGER.debug("new" + event.getNewValue());
    LOGGER.debug("old" + event.getOldValue());

    if (event.getNewValue() != null && 
            !((String) event.getNewValue()).isEmpty()) {

            LOGGER.debug("OK");
        }
}

我真的不明白。

实际上,selectOneMenu位于弹出窗口内。

我在弹出窗口之外移动了selectOneMenu并且它可以工作。我是否必须更改Bean的范围?

非工作配置:

<h:form>
     <rich:popupPanel>
          <h:selectOneMenu>
               ...
          </h:selectOneMenu>
     <rich:popupPanel>
<h:form>

工作配置:

<h:form>
          <h:selectOneMenu>
               ...
          </h:selectOneMenu>
     <rich:popupPanel>

     <rich:popupPanel>
<h:form>

2 个答案:

答案 0 :(得分:0)

下面的方法在您提交表单时调用

public void setSelectedValue(String selectedValue) {
    LOGGER.debug("Try to set selected value" + selectedValue);
    if (!selectedValue.isEmpty()){
        this.selectedValue = selectedValue ;
    }
}

答案 1 :(得分:0)

当值发生变化时,您需要使用AJAX进行部分表单提交。 valueChangeListener是一个钩子,它在值已更改且表单已提交时为您的代码提供通知。

下面的代码将为selectOneMenu的onchange事件注册一个AJAX事件。值会更改,然后执行菜单(将值提交给bean)。

<h:selectOneMenu layout="lineDirection" id="myMenu" value="#{dwrBean.selectedValue}"> 
   <f:selectItems value="#{dwrBean.values}"/> 
   <f:ajax/>
</h:selectOneMenu>