f: ajax не работает, когда раскрывающийся список возвращает значение null

Выпадающий список связан с конвертером. Ajax работает, когда значение раскрывающегося списка изменяется. Но в случае выбора элемента "-- Select-" из выпадающего списка 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();
    }    
}

Может ли кто-нибудь указать решение?


person Iqbal    schedule 20.10.2014    source источник


Ответы (2)


Поскольку f:ajax не запускается itemValue="#{null}" или noSelectionOption="true" (что в любом случае лучше, чем использование null), я бы рекомендовал следующее: запретить пользователю возвращаться к -- Select -- значение после того, как он уже что-то выбрал

(если только вы действительно не хотите, чтобы пользователь вернулся к опции -- Select -- после того, как он уже выбрал какую-то другую опцию)

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 на своей странице.

person Daniel    schedule 20.10.2014
comment
@BalusC, спасибо, никогда не использовал это, я думаю, решение об этом зависит от дизайнера (мне не нравится идея, что элементы на странице неявно исчезают сами по себе :), даже если это можно объяснить и звучит разумный) - person Daniel; 20.10.2014

Я нашел хитрое решение для указанной проблемы. Я хотел бы поделиться для вас. Я разместил 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>
person Iqbal    schedule 21.10.2014