Bezdepbonusu7Программирование: статьи и ответы

Вопрос

JSF: Как получить выбранный элемент из selectOneMenu, если его рендеринг динамический?

Автор вопроса: Zmicier ZaleznicenkaОтветов: 2

На мой взгляд, у меня есть два меню, которые я хочу сделать зависимыми, а именно, если первое меню содержит значения "отображать второе меню" и "не отображать второе меню", я хочу, чтобы второе меню отображалось, только если пользователь выбирает "отображать второе меню". меню" в первом меню. После того, как второе меню отобразится на той же странице, что и первое, пользователь должен выбрать из него текущий элемент, заполнить другие поля и отправить форму для сохранения значений в базе данных. Оба списка опций являются статическими, они получаются из базы данных один раз и остаются неизменными. Моя проблема в том, что я всегда получаю значение null в качестве значения выбранного элемента из второго меню. Как получить правильное значение? Пример кода представления, содержащего проблемные элементы:

<h:selectOneMenu id="renderSecond" value="#{Bean.renderSecondValue}"
                                 valueChangeListener="#{Bean.updateDependentMenus}"
                                 immediate="true"
                                 onchange="this.form.submit();" >
                    <f:selectItems value="#{Bean.typesOfRendering}" />
                </h:selectOneMenu><br />

<h:selectOneMenu id="iWillReturnYouZeroAnyway" value="#{Bean.currentItem}"
                                 rendered="#{Bean.rendered}" >
                    <f:selectItems value="#{Bean.items}" />
                </h:selectOneMenu><br />
<h:commandButton action="#{Bean.store}" value="#Store" />

Однако, если я уберу атрибут "рендеринг" из второго меню, все будет работать правильно, за исключением отображения меню на все время, которое я пытаюсь предотвратить, поэтому я предполагаю, что проблема заключается в поведении динамического рендеринга. Начальное значение isRendered равно false, так как пункт по умолчанию в первом меню - "не отображать второе меню". Когда я меняю значение в первом меню и обновляю isRendered с помощью valueChangeListener, отображается второе меню, но оно не инициализирует currentItem при отправке.

Некоторый код из моего резервного компонента приведен ниже:

public void updateDependentMenus(ValueChangeEvent value) {
    String newValue = (String) value.getNewValue();
        if ("render second menu" == newValue){
            isRendered = true;
        } else {
            isRendered = false;
        }
}

public String store(){
    System.out.println(currentItem);
    return "stored";
}

jsf

Ответы

Ответ 1 · рейтинг 3 · BalusC

Если вы используете атрибут rendered для компонентов UIInput и UICommand, то вы должны убедиться, что условие rendered оценивается в последующем запросе (во время отправки формы) точно так же, как и во время исходного запроса (во время отображения формы). форма). Когда он оценивает false, значения запроса не будут применяться/проверяться, а значения модели не будут обновляться, и для рассматриваемого компонента (компонентов) не будет выполняться никаких действий.

Простое решение состоит в том, чтобы поместить компонент в область сеанса, но это также имеет оговорки (плохой пользовательский интерфейс при открытии одной и той же страницы в нескольких вкладках/окнах браузера). В JSF 2.0 вместо этого вы можете использовать область представления. В JSF 1.x для этого можно использовать t:saveState Tomahawk.

Ответ 2 · Zmicier Zaleznicenka

Проблема возникает только тогда, когда у нас есть "не отображать" в качестве первого варианта. Я решил изменить значения в базе данных, и теперь у меня есть "рендеринг второго меню" в качестве первого. При таком подходе все работает нормально.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы