Как сохранить 2 зависимых значения selectOneMenu - PullRequest
2 голосов
/ 16 декабря 2011

У меня небольшая проблема с выпадающим списком, связанным с jsf. У меня есть 2 выпадающих выбора: первый независимый, второй показывает результат в зависимости от Это код:

<h:panelGroup id="addressPanel">        
        <h:outputLabel styleClass="label" value="Provincia: " />
        <h:selectOneMenu onchange="updateCombos()"
            value="#{indirizzoCtrl.codiceProvincia}"  >
            <f:selectItem itemValue="" itemLabel=""></f:selectItem>
            <f:selectItems value="#{indirizzoCtrl.allProvincia}" var="c"
                itemLabel="#{c.nome}" itemValue="#{c.siglaProvincia}" />
        </h:selectOneMenu>
        <h:outputLabel styleClass="label" value="Comune: " />
        <h:selectOneMenu 
            value="#{indirizzoCtrl.codiceComune}"  >
            <f:selectItem itemValue="" itemLabel=""></f:selectItem>
            <f:selectItems value="#{indirizzoCtrl.allComuni}" var="c"
                itemLabel="#{c.descrizione}" itemValue="#{c.codiceComune}" />

        </h:selectOneMenu>
    </h:panelGrid>
</h:panelGroup>
<p:remoteCommand name="updateCombos" update="addressPanel masterForm:msg"  />              
<p:commandButton styleClass="commandButton" value="Save"
    actionListener="#{indirizzoCtrl.save}">
</p:commandButton>

Что ж, когда пользователь сохраняет форму после выбора обоих значений, управляемый bean-компонент indirizzoCtrl (область действия запроса) не может отобразить значение второго раскрывающегося списка обратно в список, поскольку списка нет. На самом деле #{indirizzoCtrl.allComuni} вызывает метод получения, который извлекает данные из БД, только если indirizzoCtrl.codiceProvincia!=null ... и это ложно до фазы обновления модели. Таким образом, при первом вызове метода получения списка невозможно получить какие-либо значения, и это приводит к сбою фазы модели обновления. Как я могу справиться с этим сценарием ... Я думаю, что он довольно распространенный, поэтому я что-то здесь упускаю ...

1 Ответ

5 голосов
/ 16 декабря 2011

Вместо этого поместите компонент в область просмотра. Он будет жить до тех пор, пока вы взаимодействуете с одним и тем же видом с помощью ajax. Компонент bean-объекта области действия действительно воссоздается при каждом отдельном запросе, также ajax-запросы, поэтому свойства bean-компонента будут инициализированы по умолчанию.

@ManagedBean
@ViewScoped
public class IndidizzoCtrl implements Serializable {

    // ...

}

Смотри также:


Не связанный с конкретной проблемой, я также настоятельно рекомендую изменить методы получения на , а не выполнять какую-либо деловую работу, а просто возвращать данные. Вместо этого выполняйте бизнес-работу в методах (действия) слушателя. Э.Г.

<h:selectOneMenu value="#{bean.menu1item}">
    <f:selectItems value="#{bean.menu1items}" />
    <f:ajax listener="#{bean.updateMenu2}" render="menu2" />
</h:selectOneMenu>
<h:selectOneMenu id="menu2" value="#{bean.menu2item}">
    <f:selectItems value="#{bean.menu2items}" />
</h:selectOneMenu>

с

public void updateMenu2() {
    menu2items = loadItBasedOn(menu1item);
}

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...