Вопрос по java, managed-bean, jsf, selectonemenu, ajax – SelectOneMenu обновляет другие SelectOneMenu

6

Я хочу обновить второе SelectOneMenu, когда я выбираю любой элемент первого SelectOnMenu. Как и сейчас, я получаю значения для SelectOneMenus из ManagedBean. Полагаю, я использовал AJAX (jquery) для отправки параметров в ManagedBean.

<h:form>
    <div class="center">
        <h:panelGrid id="editTable" columns="2" styleClass="center">
            ...
            <h:outputText value="#{msg.timetable_list_category}" />
            <h:selectOneMenu class="category">
                <f:selectItems value="#{categoryBackingBean.categorys}" var="c"
                    itemLabel="#{c.category_Name}" itemValue="#{c.id}" />
            </h:selectOneMenu>

                <h:outputText value="#{msg.timetable_list_seminarblock}" />
            <h:selectOneMenu class="seminarblock">
                <f:selectItems value="#{seminarblockBackingBean.seminarblocks}" var="s"
                    itemLabel="#{s.seminarblock_Name}" itemValue="#{s.seminarblock_Id}" />
            </h:selectOneMenu>
            ...
        </h:panelGrid>
        ...
    </div>
</h:form>

Ваш Ответ

2   ответа
9

который вызывается при изменении значения вашего selectOneMenu:

<h:selectOneMenu class="category" valueChangeListener="#{yourBean.selectOneMenuListener}">
    <f:selectItems value="#{categoryBackingBean.categorys}" var="c"
        itemLabel="#{c.category_Name}" itemValue="#{c.id}" />
</h:selectOneMenu>

Затем в вашем бине у вас есть этот метод:

public void selectOneMenuListener(ValueChangeEvent event) {
    //This will return you the newly selected
    //value as an object. You'll have to cast it.
    Object newValue = event.getNewValue(); 
    //The rest of your processing logic goes here...
}

Для обновления страницы вы можете добавитьonchange="submit()" на ваш<h:selectOneMenu/>, Для некоторого частичного рендеринга вы можете попробовать добавить это<f:ajax/> вместоonchange="submit()":

<h:selectOneMenu class="category" valueChangeListener="#{yourBean.selectOneMenuListener}">
    <f:selectItems value="#{categoryBackingBean.categorys}" var="c"
        itemLabel="#{c.category_Name}" itemValue="#{c.id}" />
    <f:ajax event="change" execute="@form" render="theIdOfTheComponentYouWantToReRender"/>
</h:selectOneMenu>

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

Есть ли возможность отправить параметр без changeListener? thomas.st
Проблема в том, что в фоновом режиме есть база данных. Если я установлю значение идентификатора по умолчанию, и кто-то изменит базу данных, программа больше не будет работать, и во втором SelectOneMenu больше не будет элементов. Категории (1st SelectOneMenu) отображаются отлично, но я могу изменить & lt; значение 1-го SelectOneMenu, чтобы получить значения для 2-го. Информация: 1 категория имеет больше семинаров thomas.st
Можете ли вы развить ваш контекст немного дальше? Что вы пытаетесь достичь и / или какие ограничения у вас есть?
С вашим решением он теперь работает нормально, но в нем есть небольшая ошибка. Когда вы открываете этот сайт в первый раз, во втором SelectOneMenu отсутствуют значения, так как значение valueChangedEvent вызывается только при первом изменении выбранного элемента. thomas.st
Вы инициализируете оба своих списка поддержки? Если вы этого не сделаете, во втором списке не будет элементов, ожидающих, пока первый список определит, какие из них должны туда попасть. Вы должны определить значение по умолчанию для первого меню и заполнить второе в соответствии с ним при загрузке страницы.
0

Primefaces имеет отличную особенность того, что вы пытаетесь достичь. Он уже использует Ajax, так что вам не нужно беспокоиться о написании кода самостоятельно.

Могу ли я использовать & lt; f: ajax & gt; несерьезные главные лица? Как я могу отправить параметры в бин? thomas.st

Похожие вопросы