在我看来,我有两个菜单,我想依赖,即,如果第一个菜单保存值“渲染第二个菜单”和“不渲染第二个菜单”,我想只有当用户选择“渲染第二个”时才能渲染第二个菜单菜单“第一个菜单中的选项 . 在第二个菜单呈现与第一个菜单相同的页面后,用户必须从中选择当前项目,填写另一个字段并提交表单以在数据库中存储值 . 两个选项列表都是静态的,它们从数据库中获取一次并保持不变 . 我的问题是我总是将null作为第二个菜单中所选项目的值 . 如何获得适当的 Value ?包含有问题元素的示例代码示例是:
<h:selectOneMenu id="renderSecond" value="#{Bean.renderSecondValue}"
valueChangeListener="#{Bean.updateDependentMenus}"
immediate="true"
onchange="this.form.submit();" >
<f:selectItems value="#{Bean.typesOfRendering}" />
</h:selectOneMenu>
<h:selectOneMenu id="iWillReturnYouZeroAnyway" value="#{Bean.currentItem}"
rendered="#{Bean.rendered}" >
<f:selectItems value="#{Bean.items}" />
</h:selectOneMenu>
<h:commandButton action="#{Bean.store}" value="#Store" />
但是,如果我从第二个菜单中删除“呈现”属性,一切正常,除了我试图阻止的所有时间显示菜单,所以我建议问题是动态渲染的行为 . isRendered的初始值为false,因为第一个菜单中的默认项是“不渲染第二个菜单” . 当我在第一个菜单中更改值并使用valueChangeListener更新isRendered时,将显示第二个菜单,但在提交时它不会初始化currentItem .
我的支持bean的一些代码如下:
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";
}
2 回答
如果您在
UIInput
和UICommand
组件上使用rendered
属性,则必须确保rendered
条件在后续请求中(在提交表单期间)与初始请求期间(在显示期间)完全相同的方式评估形成) . 当它评估为false时,将更新请求值,并且不会为相关组件调用任何操作 .一个简单的解决方法是将bean放在会话范围内,但这也有一些警告(在多个浏览器选项卡/窗口中打开相同页面时用户体验不佳) . 在JSF 2.0上,您可以使用视图范围 . 在JSF 1.x上你会使用Tomahawk的
t:saveState
.只有当我们将“不渲染”作为第一选择时才会出现问题 . 我决定更改数据库中的值,现在我将“渲染第二个菜单”作为第一个 . 有了这样的方法,一切都很好 .