f:当dropdown返回null时,ajax不工作

时间:2014-10-20 03:41:58

标签: ajax jsf jsf-2.2 selectonemenu

下拉列表与转换器相关联。当下拉值更改时,ajax工作。 但是如果选择" - 选择 - "来自下拉列表的项目,ajax不会调用监听器。我找不到任何好的解决方案。代码如下。

<h:selectOneMenu value="#{cc.attrs.beanProperty}" converter="myConverter" >
  <f:selectItem itemValue="#{null}" itemLabel="-- Select --" />
  <f:selectItems value="#{cc.attrs.list}" var="item" itemValue="#{item}" itemLabel="#{item.name}" />
  <f:ajax render=":form1" listener="#{myBean.listener}"/>
</h:selectOneMenu>

转换器:

@FacesConverter(value = "myConverter")
public class VendorConverter implements Converter {

    @Inject ObjectDAO dao;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if(value == null || value.contains("Select")){
            return null;            
        }
        return dao.find(Integer.valueOf(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if(value == null) {
            return null;
        }                  
        return ((MyObject) value).getId().toString();
    }    
}

有人能指出解决方案吗?

2 个答案:

答案 0 :(得分:2)

由于f:ajaxitemValue="#{null}"没有触发noSelectionOption="true"(这比null用法更好)我会推荐以下内容,用户在选择了

之后返回 - 选择 -

(除非你真的希望用户在他选择了其他选项之后回到 - 选择 - 选项)

1)替换

<f:selectItem itemValue="#{null}" itemLabel="-- Select --" />

<f:selectItem noSelectionOption="true" itemLabel="-- Select --" />

2)像这样添加itemDisabled的使用

<f:selectItem itemDisabled="#{not empty cc.attrs.beanProperty}" 
    noSelectionOption="true" itemLabel="-- Select --" />

或代替itemDisabled="#{not empty cc.attrs.beanProperty}"使用<h:selectOneMenu hideNoSelectionOption="true">取决于您的偏好。


另请注意,为了找出代码中的错误,您可以尝试在页面中放置<h:message<h:messages

答案 1 :(得分:0)

我找到了解决上述问题的棘手办法。我想和大家分享一下。我放置了h:commandButton并使用jquery单击该事件。因此,当用户从下拉列表中选择-- Select --项时,它将执行必要的功能。

<h:selectOneMenu value="#{cc.attrs.beanProperty}" converter="myConverter" onchange="selectedItem(this)" >
  <f:selectItem itemValue="#{null}" itemLabel="-- Select --" />
  <f:selectItems value="#{cc.attrs.list}" var="item" itemValue="#{item}" itemLabel="#{item.name}" />
  <f:ajax render=":form1" listener="#{myBean.listener}"/>
</h:selectOneMenu>

<h:commandButton class="reset" action="#{mybean.reset}" style="display: none;">            
    <f:ajax render="#{cc.attrs.renderComponent}"/>
</h:commandButton>


<script>
     function selectedItem(that) {                  
         if($(that).val() === ""){
               $(".reset").click();
         }
     }
</script>