2010-05-19 68 views
1

在我看来,我有两个菜单,我想依赖,即,如果第一个菜单保存值“呈现第二个菜单”和“不呈现第二个菜单”,我想第二个菜单只有当用户选择“渲染第二个菜单“选项。第二个菜单在与第一个菜单相同的页面上呈现后,用户必须从中选择当前项目,填充另一个字段并提交表单以将值存储在数据库中。两个选项列表都是静态的,它们从数据库中获取一次并保持不变。我的问题是我总是从第二个菜单中选择的项目的值为null。如何获得适当的价值?保存有问题的元件的视图的示例代码:JSF:如果selectOneMenu的渲染是动态的,如何从selectOneMenu中获取所选项目?

<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,因为第一个菜单中的默认项目是“不渲染第二个菜单”。当我更改第一个菜单中的值并使用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"; 
} 

回答

3

如果您在使用上UIInputUICommand组件rendered属性,那么你必须确保该rendered条件计算正好在随后请求同样的方式,因为它是在初始请求期间(提交表单时) (在显示表单的过程中)。如果评估结果为假,那么请求值将不会被应用/验证,模型值将不会更新,也不会针对相关组件调用任何操作。

一个简单的解决方法是将bean放入会话范围,但这也有一些警告(当在多个浏览器选项卡/窗口中打开相同页面时,用户体验不佳)。在JSF 2.0上,您可以使用视图范围。在JSF 1.x上,您可以使用Tomahawk的t:saveState

+0

是的,那正是我也在想的。但是,并不知道视图范围。谢谢。 – 2010-05-19 18:21:04

0

问题出现时,我们有“不渲染”作为第一选择。我决定改变数据库中的值,现在我有第一个“渲染第二个菜单”。采用这种方法,一切正常。

相关问题