Событие изменения selectoneMenu не работает с одним значением

У меня есть два выпадающих меню в моей программе, второе заполняется на основе выбранного значения из первого.

Когда в первом меню есть только одно значение, второе меню не отражает значения, но оно работает, когда у меня есть более одного значения. Что может быть причиной ошибки?

Вот код:

<h:selectOneMenu id="blSearchFacilityInput"
                 value="#{bLDashBoardAction.facilityId}" style="width:80px;">
    <f:ajax event="valueChange" render="blSearchzoneInput"
            listener="#{bLDashBoardAction.facValueChangeEvent}"/> 
    <f:selectItems value="#{bLDashBoardAction.svaFaciltyList}" var="c"
                   itemLabel="#{c.facCode}" itemValue="#{c.id}"/>
</h:selectOneMenu>
<h:selectOneMenu id="blSearchzoneInput" value="#{bLDashBoardAction.zoneId}"
                 style="width:80px;">
    <f:ajax event="valueChange" render="blSearchSectorInput"
            listener="#{bLDashBoardAction.zoneValueChangeEvent}"/>
    <f:selectItems value="#{bLDashBoardAction.zoneList}" var="c"
                   itemLabel="#{c.zoneCode}" itemValue="#{c.zoneId}"/>
</h:selectOneMenu>

person Bernad Ali    schedule 18.01.2013    source источник
comment
Смотрит на это: stackoverflow.com /вопросы/7757571/   -  person Christophe Roussy    schedule 18.01.2013
comment
Вы инициализируете #{bLDashBoardAction.facilityId} значением по умолчанию в вашем поддерживающем компоненте?   -  person Elias Dorneles    schedule 18.01.2013
comment
Из вашего вопроса я предполагаю, что в вашем первом раскрывающемся списке показаны параметры, но не присвоено значение. И поскольку изменить его на другое значение невозможно, обновление второго меню никогда не запускается. Может ли это быть?   -  person Elias Dorneles    schedule 18.01.2013


Ответы (1)


Если есть только один элемент, который уже предварительно выбран по умолчанию, то при повторной попытке выбрать его практически ничего не изменится. Вам действительно нужен физический второй элемент, чтобы вызвать событие изменения.

Добавьте еще один элемент со значением null или noSelectionOption="true".

<h:selectOneMenu id="blSearchFacilityInput"
                 value="#{bLDashBoardAction.facilityId}" style="width:80px;">
    <f:ajax render="blSearchzoneInput"
            listener="#{bLDashBoardAction.facValueChangeEvent}"/> 
    <f:selectItem itemLabel="--select one--" noSelectionOption="true" />
    <f:selectItems value="#{bLDashBoardAction.svaFaciltyList}" var="c"
                   itemLabel="#{c.facCode}" itemValue="#{c.id}"/>
</h:selectOneMenu>

Теперь вы можете успешно инициировать событие изменения значения. Обратите внимание, что это уже событие по умолчанию, поэтому для краткости я опустил его в коде. Нет необходимости повторять значения по умолчанию.

Альтернативой является автоматическое предварительное заполнение дочернего раскрывающегося списка, если в родительском раскрывающемся списке есть только один элемент. Например, сразу после того момента, когда вы заполняете svaFacilityList:

if (svaFaciltyList.size() == 1) {
    zoneList = fillItBasedOn(svaFaciltyList.get(0));
}
person BalusC    schedule 18.01.2013