На мой взгляд, у меня есть два меню, которые я хочу сделать зависимыми, а именно, если первое меню содержит значения «отображать второе меню» и «не отображать второе меню», я хочу, чтобы второе меню отображалось, только если пользователь выбирает «отображать второе меню». меню" в первом меню. После того, как второе меню отобразится на той же странице, что и первое, пользователь должен выбрать из него текущий элемент, заполнить другие поля и отправить форму для сохранения значений в базе данных. Оба списка опций являются статическими, они получаются из базы данных один раз и остаются неизменными. Моя проблема в том, что я всегда получаю значение 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";
}