SelectOneMenu обновляет другие SelectOneMenu [дубликаты]

Я хочу обновить второй 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>

person thomas.st    schedule 21.09.2012    source источник


Ответы (2)


На самом деле вы можете использовать ValueChangeListener, который вызывается при изменении значения вашего 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 или, при необходимости, панель, обертывающую часть вашей формы.

person Fritz    schedule 21.09.2012
comment
Есть ли возможность отправить параметр без changeListener? - person thomas.st; 21.09.2012
comment
Можете ли вы, пожалуйста, уточнить ваш контекст немного дальше? Чего вы пытаетесь достичь и/или какие ограничения у вас есть? - person Fritz; 21.09.2012
comment
С вашим решением теперь все работает нормально, но в нем есть небольшая ошибка. Когда вы открываете этот сайт в первый раз, во втором SelectOneMenu нет значений, потому что valueChangedEvent вызывается только в том случае, если вы изменяете выбранный элемент в первый раз. - person thomas.st; 21.09.2012
comment
Вы инициализируете оба своих резервных списка? Если вы этого не сделаете, во втором списке не будет элементов, ожидающих, пока первый определит, какие из них должны быть там. Вы должны определить значение по умолчанию для первого меню и заполнить второе в соответствии с ним при загрузке страницы. - person Fritz; 21.09.2012
comment
Проблема в том, что в фоновом режиме есть база данных. Если я установлю для идентификатора значение по умолчанию, а кто-то изменит базу данных, программа больше не будет работать, и во втором SelectOneMenu снова не будет элементов. Категории (1-й SelectOneMenu) отображаются отлично, но мне нужно «изменить» значение 1-го SelectOneMenu, чтобы получить значения для 2-го. Информация: в 1 категории больше блоков семинаров - person thomas.st; 21.09.2012
comment
РЕДАКТИРОВАТЬ: Спасибо, я решил проблему. Когда я получаю категории из базы данных, я беру первый элемент и устанавливаю для него идентификатор по умолчанию из второго SelectOneMenu. - person thomas.st; 21.09.2012
comment
@user1586660 user1586660 Извините за задержку, но я рад, что вы решили эту проблему :). То, что вы сделали, это именно то, о чем я говорил (может быть, я не ясно выразился с самого начала, и я извиняюсь за это). - person Fritz; 21.09.2012

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

person Paulius Matulionis    schedule 21.09.2012
comment
Могу ли я использовать ‹f:ajax› вместо простых знаков? Как я могу отправить параметры bean-компоненту? - person thomas.st; 21.09.2012