【问题标题】:jsf selectOneMenu value does not changejsf selectOneMenu 值不变
【发布时间】:2017-03-30 23:00:33
【问题描述】:

我有一个具有正确值(字符串列表)的 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>

【问题讨论】:

    标签: jsf triggers


    【解决方案1】:

    提交表单时调用以下方法

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

    【讨论】:

    • 是的,但是我希望在 selectOneMenu 中选择另一个元素时设置 selectedValue,而不是在提交表单时设置。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多